mysql执行计划看必会(explain讲解)

explain会看到的信息

共有10个字段,下面讲逐一讲解这10个字段,我经常看的的是id,type,rows这几个

1、id
表示查询中执行select子句或操作表的顺序,id执行顺序从大到小,即id越大越先被执行,如果id相同,则从上到下

2、select_type
表示查询中每个select子句的类型(简单 OR 复杂)
(1)、SIMPLE:查询中不包含子查询或者UNION
(2)、查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
(3)、在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
(4)、在FROM列表中包含的子查询被标记为:DERIVED(衍生)
(5)、若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在 FROM子句的子查询中,外层SELECT将被标记为:DERIVED
(6)、从UNION表获取结果的SELECT被标记为:UNION RESULT

阿里有一篇select_type的详解文章https://yq.aliyun.com/articles/61934

3、type
这是优化的一个重要的参考参数或者指标,表示MySQL在表中找到所需行的方式,又称“访问类型”
常见的类型有

性能指标从低到高,最后的性能最优。
网上有一个比较全面的指标排序
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,
一般来说,得保证查询至少达到range级别,最好能达到ref,至少达到range。
(1)、ALL: 扫描全表,将进行全表扫描来查找所需数据,性能最差
(2)、index: 扫描全部索引树,与ALL区别为index类型只遍历索引树
(3)、range: 扫描部分索引,索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
(4)、ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找
(5)、eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
(6)、const, system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。system是const类型的特例,当查询的表只有一行的情况下, 使用system。
(7)、NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引。
4、possible_keys
指出MySQL能使用哪个索引在该表中找到行。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。
有一篇优化实例:http://blog.csdn.net/gongmf/article/details/52298802
5、key
显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL
TIPS:查询中若使用了覆盖索引,则该索引仅出现在key列表中
6、key_len
显示MySQL决定使用的键长度。表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。
注:key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
key_len计算的一篇文章:http://blog.csdn.net/blakeFez/article/details/49871165
7、ref
:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。

ref可以用于使用=或<=>操作符的带索引的列。

8、rows
:这个数表示mysql要遍历多少数据才能找到,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,而不是查找到结果的行数

9、Extra
:包含不适合在其他列中显示但十分重要的额外信息。
Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

using where是使用上了where限制,表示MySQL服务器在存储引擎受到记录后进行“后过滤”(Post-filter),如果查询未能使用索引,Using where的作用只是提醒我们MySQL将用where子句来过滤结果集。

impossible where 表示用不着where,一般就是没查出来啥。

Using filesort(MySQL中无法利用索引完成的排序操作称为“文件排序”)当我们试图对一个没有索引的字段进行排序时,就是filesoft。它跟文件没有任何关系,实际上是内部的一个快速排序。

Using temporary(表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询),使用filesort和temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

白发渔樵

白发渔樵

发表评论

电子邮件地址不会被公开。 必填项已用*标注