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 语句中