SQL执行计划,记录一条SQL语句在数据库中执行时,一步步都做了什么。explain 可以帮助我们在不真正执行某个sql语句时,就执行mysql怎样执行,这样方便我们去分析sql指令,进行SQL优化。
查看SQL语句的执行计划:
explain select * from work_order_reply;
或
desc select * from work_order_reply;
输出结果:
执行计划输出的信息有:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、extra,下面我们就介绍一下这些列代表的含义以及在做SQL优化时,需要重点查看的信息。
1、id,select的查询序列号
在执行一些复杂SQL语句,包含子查询、关联查询等时,SQL语句会有一个执行的优先级。id越大,sql优先被执行;id相同时,从上到下依次执行。
2、select_type, 查询语句类型
select_type的值不同,代表不同的查询方式。
- SIMPLE,简单查询,不适用union或子查询等
- PRIMARY,若查询中包含任何复杂的子查询部分,最外层的select被标记为PRIMARY
- UNION,UNION中的第二个或后面的select语句被标记为UNION
- DEPENDENT UNION , UNION查询的第二个或后面的selelct语句,取决于外面的查询。(union作为子查询,如:)
EXPLAIN select * from work_order_reply
where id in (select id from dosm_duty_change
union
select id from dosm_duty_leave);
- UNION RESULT, union的查询结果
- SUBQUERY ,子查询的第一个select
- DEPENDENT SUBQUERY,子查询的第一个select,取决于外面的查询
- DERIVED, 派生表的select, from子句的子查询
- MATERIALIZED,物化子查询,在SQL执行过程中,第一次需要子查询结果时执行子查询并将子查询的结果保存为临时表,后续对子查询的结果集的访问直接通过临时表获取
- UNCACHEABLE SUBQUERY,不能被缓存的子查询
- UNCACHEABLE UNION,uinon查询的结果不能被缓存
3、table,查询涉及的表或衍生表
4、partitions ,查询涉及到的分区
5、type,提供判断查询是否高效的依据,是否使用了索引及索引类型。
- system:表中只有一条数据,相当于系统表,这个类型是特殊的const类型
- const:主键或唯一索引的常量查询,表中最多只有一条记录符合查询,一般使用主键或唯一索引进行定值查询
- eq_ref:出system、const类型外,效率最高的链接类型;唯一索引扫描,对于每个索引建,表中只有一条记录与之对应;常用于主键或唯一索引扫描。
- ref:一般出现在多表的join查询,针对非唯一索引或非主键索引,即链接不能基于键值选择单行,可能是多行。
- range:表示使用索引范围查询,通过索引字段范围获取表中的部分数据,一般用于 = 、<> 、> 、>= 、< 、<= 、is null 、between 、in 操作中
- index:索引扫描树,说明查询使用了索引并用索引扫描做了排序。
- ALL: 全表扫描,没有任何索引可以使用。尽量避免全表扫描。
6、possible_keys, 指查询可以选择的索引
7、key:查询实际使用的索引
8、key_len:索引中使用的字节数,只计算利用索引作为index key的索引长度,不包括用于group by/order by 的索引的长度
9、ref:显示索引字段关联了哪张表的哪个字段
10、rows:根据表统信息及选用情况,大致估算出找到所需记录的行数,数值越小越好。
11、filtered:返回结果行数栈读取行数的百分比,数值越大越好
12、extra:包含不适合在其他列中显示但又很重要的额外信息。
- using filesort:mysql会对数据使用非索引列进行排序,而不是按照索引顺序进行读取,这时需优化索引
- using temporary:使用临时表保存中间结果,这时需要优化索引
- using index:表示select 操作使用了索引覆盖,避免回表访问数据行,效率较高
- using where :where子句用于限制哪一行
- using union(index1,index2...):表示查询使用了索引合并策略,这时可能需要对索引进行优化,将几个单列索引用一个组合索引来代替。(创建组合索引时注意索引列的顺序,组合索引遵循最左前缀查询原则)。