Explain 执行计划包含有 12 个字段:
- id:标识查询中执行 select 子句或者操作表的顺序。id 的值越大表示优先级越高,越先被执行
- select_type:标识查询的类型,比如普通查询、子查询、UNION 查询
- table:查询的表名,不一定是真实存在的表,有别名显示别名也可能是临时表。
- partitions:查询时匹配到的分区信息。非分区表值是 Null,当查询表是分区表时显示分区表命中的分区情况。
- type:**查询的性能指标。**system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- possible_keys:查询语句中涉及到的所有索引,并不一定会是查询数据时所用到的索引。
- key:区别于 possible_keys,它是查询中实际使用到的索引。
- ken_len:查询用到的索引长度:字节数。原则上越短越好,索引占用的存储空间越小。key_len 只计算 where 条件中用到的索引长度,排序和分组用到的索引不会计入 key_len。
- ref:常见的有 const,func, null, 字段名。
- 当使用常量等值查询时,显示 const。
- 当使用关联条件查询时,显示关联表的字段名。
- 当查询条件使用了函数,或字段类型和传参类型不匹配发生隐式转换时,显示为 func。
- 其他情况是 null
- rows:SQL 执行结果需要扫描行数的估算值。
- filtered:标识存储引擎返回后的数据,在经过条件过滤后,剩下满足条件的记录的数量占比。
- Extra:额外信息,SQL 优化重点。
- Using index:使用到覆盖索引字段时,此时不需要回表,Extra 是 Using index。
- Using where:查询时未找到覆盖索引,全表扫描数据进而通过 where 条件过滤数据。
- Using temporary:查询后结果需要使用临时表进行存储,一般在排序或者分组查询时用到。
- Using fileSort:无法利用索引完成排序工作,即 order by 字段没加索引,此类SQL需要优化。
- Using join buffer:连表查询时如果表的连接条件没加索引,需要有一个连接缓冲区存储中间结果。type 通常是 ALL 需要优化。