描述
查看sql语句的执行计划,从中找出待优化的地方
字段详解
执行explain后会得到如下一个结果
涉及的字段:id,select_type,table,tyoe,possible_keys,key,key_len,ref,rows,Extra
字段详解:
- id
Select查询的序列号,是一串数字,执行select字句或操作表的顺序
分三种情况:- Id相同;加载表顺序从上到下
- Id不同;id越大优先级越高,越先被执行
- Id有相同,也有不同,同时存在;id相同的,认为同一组,不同组之间比较时,根据大小,越大优先级越高;相同组,从上到下
- Select_type
显示本次select类型,其中类型有:- Simple,简单查询,不包含子查询以及union
- Subquery,子查询中第一个select语句
- Derived,派生表,临时表,由子查询派生出来,位于from中的子查询
- Union,位于union中第二个及其以后的子查询被标记为union,第一个被标记为primary,如果union为与from中则被标记为derived
- Union result,用来从匿名临时表中检索结果的select被标记为union result
- Dependent union
- Dependent subquery
- Table
访问类型,重要指标,结果从好到坏依次是:
System > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all,一般来说,至少得保证访问类型级别在range以上,最好能达到ref。
类型说明:- All,最坏的情况,全表扫描,扫描数据行
- Index,与all一样,区别是index扫描索引树,以下两种情况会触发
- 索引是查询的覆盖索引,就是说索引查询的数据满足了查询中所需的所有数据,只扫描索引树,不进行回表查询。此时Extra列显示的是using index
- 全表扫描按照索引的顺序查找数据行。
总结:上述1,2的区别在于是否需要回表操作~
-
Range,索引范围查找。Ref列为null
-
Index_subquery,使用in的子查询,子查询结果给父查询的非唯一索引查询使用
-
Unique_subquery,与index_subquery类似,区别在于父查询的查询条件为其唯一索引
-
Index_merge,一个查询中很多索引被用到时,可能会触发index_merge的优化机制
-
Ref_or_null,与ref类似,但是会多一个查询,来看哪些行包含了null
-
Fulltext,全文索引
-
Ref,触发联合索引最左前缀或索引不是主键或索引不是唯一索引,即查询结果多于一行
-
Eq_ref,只匹配到一行的时候,一般使用唯一索引查找或主键查找时发生
-
Const,最多只有一行匹配,使用主键或唯一索引的时候
-
System,表只有一行,一个const type的特殊类型
总结:system以及const两种类型差不多,当级别为all以及index的时候,就得进行相应的优化。
- Possible_keys
可能使用的索引 - Key
Mysql实际决定使用的索引 - Key_len
Mysql使用的键长度,不失精度的情况下,长度越短越好 - Ref
显示哪个列或常数与key一起从表中选择行 - Rows
执行查询时,检查的行数。这是一个预估值 - Extra
显示mysql查询过程中的一些详细信息以及对查询计划的一些重要补充信息。
类型: - Using file sort。Mysql两种排序方式,文件排序以及索引排序,此处表明进行的排序操作为文件排序
- Using temporary。Mysql使用临时表存储结果集
- Not exists。
- Using index。查询覆盖了索引,不需要回表读取数据文件。
- Using where。
- Using join buffer。
- Impossible where。Where子句值总是false,不能获取任何元组
- Select tables optimized away。
- Distinct。优化distinct操作
其他
关于排序
两种方式:
- 通过有序索引
索引结构为B+树,已经是有序的结构。Explain 分析时,显示为using index - 通过filesort
进行了额外的排序操作。Explain 分析时using filesort