explain显示了mysql如何使用索引来处理select语句以及连接表,无法分析存储过程、insert、update和delete等语句,可以帮助我们选择更好的索引和写出更优化的查询语句。
用法:
其中:
1、id:每个被独立执行的操作的标识,表示对象被操作的顺序;id值大,先被执行;如果相同,执行顺序从上到下;
2、select_type:查询中每个select子句的类型:
select_type | 说明 |
---|---|
SIMPLE | 简单SELECT语句(不是UNION操作、SELECT列不是子查询、WHERE的=条件不是子查询) |
PRIMARY | 复杂SELECT语句中的主句,只有一个,一般是UNION语句的前表,或者是子查询中的外层表 |
UNION | 一般是UNION语句的后表 |
UNION RESULT | UNION操作的结果,id通常为NULL |
SUBQUERY | SELECT列的子查询中的前表、WHERE的=条件的子查询中的前表 |
DERIVED | FROM子查询中UNION的前表 |
DEPENDENT UNION | WHERE的IN条件的子查询中的UNION的后表 |
DEPENDENT SUBQUERY | WHERE的IN条件的子查询中的UNION的前表,或者WHERE的EXIST条件的子查询中的表 |
3、table:显示每行对应的表名。若在 SELECT 语句中为表起了别名,则会显示表的别名。
4、partitions:
5、type:表示的是查找类型,是较为重要的一个指标。结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般来说,得保证查询至少达到range级别,最好能达到ref。
type | 说明 |
---|---|
system | 表中仅有一行数据 |
const |
表中只匹配一行,因为只有一个值,优化器将该列值视为常量。 表示使用了PRIMARY KEY或者UNIQUE索引。 |
eq_ref |
存储引擎是MyISAM时,从前面表的结果集中读取一行,这是除system和const外最好的连接类型。 表示使用了PRIMARY KEY或者UNIQUE索引。 |
ref | 表示使用了除PRIMARY KEY或者UNIQUE索引外的其他索引。 |
fulltext |
表示使用了全文索引。 |
ref_or_null |
表示使用了除PRIMARY KEY或者UNIQUE索引外的其他索引,但是对null值做了额外的查找。 |
index_merge |
|
unique_subquery |
|
index_subquery |
|
range |
表示使用索引检索给定范围内的行 |
index |
表示使用了覆盖索引 |
ALL |
表示使用全表扫描,最差的一种,应该进行优化。 |
6、possible_keys:表示可能会使用到的索引,如果为NULL,表示查询没有可使用的索引。
7、key:表示实际使用到的索引,如果为NULL,表示查询未使用到任何索引。
8、key_len:表示使用的索引长度。在不损失精确性的情况下,长度越短越好。
9、ref:表示查询条件索引列的使用方式。
10、rows:mysql认为的为了返回指定查询条件的结果所必须检查的行数
11、filtered:被条件过滤掉的行数百分比
12、Extra:执行计划的其他附加信息,如果是Using temporary或Using filesort,表示mysql根本不能使用索引,使查询很慢。
Extra |
说明 |
---|---|
Using where |
使用了非索引的查询条件 |
Using index |
使用了覆盖索引 |
Using temporary |
使用了UNION的结果集 |
selecttables optimized away |
使用了max()、min()函数 |
Using filesort |
使用了非PRIMARY KEY的排序 |