Explain 诊断
Explain各参数的含义如下:
列名 | 说明 |
id | 执行编号,标识 select 所属的行,如果语句中没有子查询或关联查询,只有唯一的select,每行都将显示1,否则,,内层的select语句一般会顺序编号,对应于其在原始语句中的位置 |
select_type | 显示本行是简单或复杂的select,如果查询包含任何复杂的子查询,则最外层标记为PRIMARY |
table | 访问哪个表 |
partitions | 如果查询是基于分区表的话,会显示查询将访问的分区 |
type | 数据访问/读取操作类型(All、index、range、ref、eq_ref、const/system、NULL) |
possible_keys | 揭示哪一些索引可能有利于高效的查找 |
key | 显示mysql实际决定采用哪个索引来优化查询 |
key_len | 显示mysql在索引里使用的字节数 |
ref | 显示了之前的表在key列记录的索引中查找值所用的列或常量 |
rows | 为了找到所需要的行而需要读取的行数,估算值 |
filtered | 表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数 |
Extra | 额外信息,如using index、filesort等 |
select_type 常见类型及其含义
- SIMPLE:不包含子查询或者 UNION 操作的查询
- PRIMARY:查询中如果包含任何子查询,那么最外层的查询则被标记为 PRIMARY
- SUBQUERY:子查询中第一个 SELECT
- DEPENDENT SUBQUERY:子查询中的第一个 SELECT,取决于外部查询
- UNION:UNION 操作的第二个或者之后的查询
- DEPENDENT UNION:UNION 操作的第二个或者之后的查询,取决于外部查询
- UNION RESULT:UNION 产生的结果集
- DERIVED:出现在 FROM 字句中的子查询
type常见类型及其含义
- system:这是 const 类型的一个特例,只会出现在待查询的表只有一行数据的情况下
consts
:常出现在主键或唯一索引与常量值进行比较的场景下,此时查询性能是最优的- eq_ref:当连接使用的是完整的索引并且是 PRIMARY KEY 或 UNIQUE NOT NULL INDEX 时使用它
ref
:当连接使用的是前缀索引或连接条件不是 PRIMARY KEY 或 UNIQUE INDEX 时则使用它- ref_or_null:类似于 ref 类型的查询,但是附加了对 NULL 值列的查询
- index_merge:该联接类型表示使用了索引进行合并优化
range
:使用索引进行范围扫描,常见于 between、> 、< 这样的查询条件index
:索引连接类型与 ALL 相同,只是扫描的是索引树,通常出现在索引是该查询的覆盖索引的情况- ALL:全表扫描,效率最差的查找方式
阿里编码规范要求:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好
key列
实际在查询中是否使用到索引的标志字段
Extra列
Extra 列主要用于显示额外的信息,常见信息及其含义如下:
- Using where :MySQL 服务器会在存储引擎检索行后再进行过滤
- Using filesort:通常出现在 GROUP BY 或 ORDER BY 语句中,且排序或分组没有基于索引,此时需要使用文件在内存中进行排序,因为使用索引排序的性能好于使用文件排序,所以出现这种情况可以考虑通过添加索引进行优化
- Using index:使用了覆盖索引进行查询,此时不需要访问表,从索引中就可以获取到所需的全部数据
- Using index condition:查找使用了索引,但是需要回表查询数据
- Using temporary:表示需要使用临时表来处理查询,常出现在 GROUP BY 或 ORDER BY 语句中