SQL调优之Explain关键字详解( 二 )


NULL的前提是你已经建立了索引 。

SQL调优之Explain关键字详解

文章插图
SYSTEM表只有一行记录(等于系统表),这是const类型的特列,平时不大会出现,可以忽略 。
const表示通过索引一次就能找到,const用于比较 primary和 unique索引 。因为只匹配一行数据 , 所以很快 。
简单来说 , const是直接按主键或唯一键读取 。
SQL调优之Explain关键字详解

文章插图
eq_ref用于联表查询的情况,按联表的主键或唯一键联合查询 。多表join时,对于来自前面表的每一行,在当前表中只能找到一行 。这可能是除了system和const之外最好的类型 。
SQL调优之Explain关键字详解

文章插图
ref 可以用于单表扫描或者连接 。如果是连接的话,驱动表的一条记录能够在被驱动表中通过非唯一(主键)属性所在索引中匹配多行数据,或者是在单表查询的时候通过非唯一(主键)属性所在索引中查到一行数据 。
ref_or_null 类似ref , 但是可以搜索值为NULL的行 。
SQL调优之Explain关键字详解

文章插图
index_merge表示查询使用了两个以上的索引 , 最后取交集或者并集,常见and,or的条件使用了不同的索引,官方排序这个在ref_or_null之后 , 但是实际上由于要读取多个索引 , 性能可能大部分时间都不如range 。
SQL调优之Explain关键字详解

文章插图
range只检索给定范围的行,使用一个索引来选择行 。一般where语句中出现between、<、>、in等的查询 。这种范围扫描索引比全表扫描要好,因为只需开始索引的某一点,而结束另一点,不用扫描全部索引;
SQL调优之Explain关键字详解

文章插图
indexFull Index Scan,index与 ALL区别为 index类型只遍历索引树,索引文件通常比数据文件小 。index从索引中读取 , 而All是从硬盘读?。?
SQL调优之Explain关键字详解

文章插图
ALL从磁盘中读?。蝗绻?桓霾檠?膖ype是All,并且表的数据量很大,那么请解决它?。。?
possible_keys字段这个表里面存在且可能会被使用的索引 , 可能会在这个字段下面出现,但是一般都以key为准 。
key字段实际使用的索引,如果为null,则没有使用索引,否则会显示你使用了哪些索引,查询中若使用了覆盖索引(查询的列刚好是索引),则该索引仅出现在key列表 。
ref字段列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 。
rows字段和Filter字段rows是根据表的统计信息和索引的选用情况,优化器大概帮你估算出你执行这行函数所需要查询的行数 。
Filter是查询的行数与总行数的比值 。其实作用与rows差不多,都是数值越小 , 效率越高 。
Extra字段Using index表示相应的 select操作中使用了覆盖索引(convering index),避免访问了表的数据行,效率不错!
SQL调优之Explain关键字详解

文章插图
覆盖索引(covering index ,或称为索引覆盖)即从非主键索引中就能查到的记录,而不需要查询主键索引中的记录,避免了回表的产生减少了树的搜索次数,显著提升性能 。
Using temporary表示MySQL需要使用临时表来存储结果集 , 常见于排序 order by和分组查询 group by 。
Using fileSort表示当SQL中有一个地方需要对一些数据进行排序的时候,优化器找不到能够使用的索引,所以只能使用外部的索引排序 。
MySQL无法利用索引完成的排序操作称为“文件排序” 。导致该问题的原因一般是Where条件和order by子句作用在了不同的列上,一般可以通过合适的索引来减少或者避免 。(出现表示不好)
上面提到的常见情况,SQL语句通常写成这样select * from a where type = 5 order by id,这类语句一般会产生Using filesort这个选项 , 即使你在type和id上分别添加了索引 。我们想一下它的工作过程,先根据type的索引从所有数据信息中挑选出满足type = 5条件的,然后根据id列的索引信息对挑选的数据进行排序,所以产生了Using filesort选项 。可以通过联合索引解决这个问题,即在type, id两列上建立一个联合索引 。


推荐阅读