执行计划就是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;
Explain 查询结果有10列,分别表示的含义是:
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)
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,在找到第一匹配的元组后即停止找同样的值的动作,需优化
覆盖索引:
需要的数据集用索引就可以找到,不必根据索引再去扫描数据文体,也可以理解为,索引树中已经包含了需要的结果集,不必要再进行表扫描。