MySQL Explain 执行计划

执行计划就是SQL的执行查询的顺序,以及如何使用索引查询,返回的结果集行数,可以根据执行计划结果结合业务对现有SQL进行优化

SELECT  * FROM dmooo_hot_search WHERE id in(3,4,5) ORDER BY num DESC;
EXPLAIN SELECT  * FROM dmooo_hot_search WHERE id in(3,4,5) ORDER BY num DESC;

MySQL Explain 执行计划

MySQL Explain 执行计划

 Explain 查询结果有10列,分别表示的含义是:

MySQL Explain 执行计划

 1.id

 是一个有序的编号,是查询的顺序号,有几个select就显示几行,id的顺序是按照select出现的顺序增长的,id列的值越大执行优先级越高越先执行,id值相同则从上往下执行,id值为null则最后执行

EXPLAIN SELECT * FROM dmooo_hot_search WHERE  type in (SELECT type FROM dmooo_href WHERE sort = 0)

MySQL Explain 执行计划

 2.select_type

表示查询中每个select子句的类型

SIMPLE:表示此查询不包含UNION查询或子查询

PRIMARY:表示此查询是最外层的查询(包含子查询)

SUBQUERY:子查询中的第一个SELECT

UNION:表示此查询是UNION的第二个或随后的查询

DEPENDENT UNION:UNION中的第二个或随后的查询语句,取决于外面的查询

UNION RESULT:UNION的结果

DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询,即子查询依赖于外层查询的结果

DERIVED:衍生,表示导出表的SELECT(FROM子句的子查询)

3.table

表示该语句查询的表

4.type

优化SQL的重要字段,也是判断SQL性能和优化程度的重要指标。取值范围如下:

const:通过索引一次命中,匹配一行数据

system:表示表中只有一行记录,相当于系统表

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配

ref:非唯一性索引扫描,返回匹配某个值的所有

range:只检索给定范围的行,使用一个索引来选择行,一般用于between、>、<

index:只遍历索引树

ALL:表示全表扫描,这个类型的查询是性能最差的查询之一,随着表数据量增大,执行效率越慢

执行效率:

  ALL<index<range<ref<eq_ref<const<system

5.possible_keys

表示MySQL在执行SQL的时候,可能用到的索引信息,仅仅是可能,实际不一定会用到

6.key

表示MySQL执行SQL的时候,真正使用到的索引,它是possible_kes的子集

7.key_len

表示查询时使用索引的字节数,可以用来评估组合索引是否完全被使用,是优化SQL时,评估索引的一个重要指标

8.rows

MySQL查询优化器根据统计信息,估算该SQL返回结果集需要扫描读取的行数,索引优化之后,扫描读取的行数变多,说明索引设置的不对,或者是查询参数值类型不对,导致索引失效,需要进行优化

9.filtered

MySQL查询结果的占比,查询结果的行数/需要扫描的行数(rows) %,百分比越高说明查询的数据越准确,越小说明查询到的数据量越大,结果集越少

10.extra

MySQL查询本身额外的重要信息,如:排序、where条件、分组等

using where:SQL使用了where过滤,效率较高

using temporary:查询有使用临时表,一般出现于排序、分组、多表join的情况,查询效率不高

using index:覆盖索引扫描,表示查询在索引树中就可查询到所需数据,不用扫描表数据文件,效率良好

using filesort:MySQL对查询结果集进行外部排序,不能通过索引顺序达到排序效果。效率较差

using join buffer:使用了连接缓存,需优化

impossible where:使用where查询不到结果集,需优化

select table optimized away:在没有group by 子句的情况下,基于索引优化max、min、count(*)等操作,在查询计划之前就要进行计算,需优化

distinct:使用了distinct,在找到第一匹配的元组后即停止找同样的值的动作,需优化

覆盖索引:

需要的数据集用索引就可以找到,不必根据索引再去扫描数据文体,也可以理解为,索引树中已经包含了需要的结果集,不必要再进行表扫描。

 

上一篇:Mysql的索引问题汇总


下一篇:explain执行计划详解