oracle执行计划
执行计划执行顺序:
- 缩进最多最先执行,缩进相同最上面先执行
- 同一级如果某个动作没有子ID就最先执行
表访问方式
- TABLE ACCESS FULL :全表扫描
- TABLE ACCESS BY ROWID :Oracle中存取单行数据最快的方法
- TABLE ACCESS BY INDEX SCAN:索引扫描,首先扫描索引得到rowid,根据rowid定位到具体行
(1). INDEX UNIQUE SCAN:针对唯一性索引扫描,最多返回1条记录
(2). INDEX RANGE SCAN:索引范围扫描,使用了<>!=between等
(3). INDEX FULL SCAN:索引全扫描
(4). INDEX FAST FULL SCAN:索引快速全扫描,且不对查询出的数据进行排序
(5). INDEX SKIP SCAN:索引跳跃扫描,复合索引中某列惟一值很少的情况
表连接方式
join:在读取做连接的两张表的数据时可以并行读取
驱动表:表连接时首先存取的表,应该取过滤限制条件后最小的表
匹配表:从驱动表获取一行具体数据后,会到该表中寻找符合连接条件的行。(大表)
- SORT MERGE JOIN:排序合并连接,a join b on a.id=b.id,先对a表按照id排序,在对b表按照id排序,然后合并两个表。排序-合并连接的表无驱动顺序,谁在前面都可以。
- NESTED LOOPS:嵌套循环,取出驱动表中第一行数据,扫描匹配表中所有数据,返回满足条件的行。
- HASH JOIN:哈希连接,只适用于等值连接,有驱动顺序。
- CARTESIAN PRODUCT:笛卡尔积连接
mysql执行计划
id
查询的序列号,id相同自上而下执行, id不同,如果为子查询id越大越先执行
select_type
- simple:查询不包含子查询或union
- primary:表示含有子查询的最外层查询
- subquery:在select或where条件中的子查询
- derived:在from中的子查询,结果存放在临时表
- union:select出现在union之后
- union result:从union中获取结果的查询
table
关于哪张表的查询
type
访问类型,查询优化指标,通常优化至少到range级别,最好能优化到ref。
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
system:表只有一行记录
const:表示通过索引一次定位数据(主键或唯一索引)
eq_ref:唯一性索引扫描
ref:非唯一性索引扫描,返回匹配某个单独值的所有行(=)
range:只检索给定范围的行,使用一个索引来选择行(between,<,>,in)
index:全索引扫描
all:全表扫描
possible_keys
涉及到的字段上存在索引,但不一定使用
key
实际使用的索引
key_len
表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度)
ref
显示索引的哪一列被使用了
rows
找到记录所需要读取的行数(估算值)
extra
额外信息
Using filesort:MySQL 对数据使用一个外部的文件内容进行了排序
Using temporary:使用临时表保存中间结果,常见于order by、group by
Using index:表示 SQL 操作中使用了覆盖索引
Using index condition:表示 SQL 操作命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录
Using where:表示 SQL 操作使用了 where 过滤条件
Using join buffer :表示 SQL 操作使用了关联查询或者子查询,且需要进行嵌套循环计算
Select tables optimized away:在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即可完成优化