下面我们以一个查询语句展示

-
id: 行标识,如果没有子查询或者联合查询,这个值是1。
-
select_type: 标识查询是简单查询还是复杂查询.(SIMPLE(简单查询),UNION(union语句的查询),SUBQUERY(子查询),DERIVED等(派生表的select))
-
table: 显示查询哪个表
-
partitions: 显示分区表命中的分区情况
-
type: 访问类型,决定如何查询表中的数据(ALL, index, range, ref, eq_ref, const, system, NULL 性能由低到高)
-
possible_keys: 查询涉及到的字段上若存在索引,但不一定被查询使用
-
key: 显示MySQL实际决定使用的键(索引)
-
key_len: 索引中使用的字节数,可通过该列计算查询中使用的索引的长度
-
ref: 查询关联, 显示表在key 列记录的索引中查找值所用的列或者常量
-
rows:根据表统计信息及索引选用情况,估算找到所需的记录需取的行数
-
filtered:估算符合条件的行数除以rows的百分比
-
extra: 额外信息
以上这些最重要的是type, possible_keys, key, rows, extra 我们再一次详细介绍这几个字段。
type
- All: 全表扫描
- index: 按索引次序全表扫描
- range: 索引范围扫描
- ref: 索引等值查询(树查找)
- eq_ref: 唯一索引上等值查询
- const: 主键上等值查询
- system: 表只有一条记录
- null: 在优化器阶段分解语句,可能不需要查表就能得到结果,例如查索引字段的最小值

possible_keys
优化器可选择的索引,会将全部索引列出来,我们知道mysql由于性能原因没有实时得到所有索引的全部数据进行比较择优,优化器进行索引选择时是根据选取部分数据页估算出索引的区分度和选择性,估算出一个最优索引,所以有些sql在某种情况下mysql会选错索引(使用其他索引效率会更高),这时我们可以使用force index()强制指定某个索引或者使用其他优化手段,来优化sql
key
优化器最终选择的索引,可以凭自己对表数据的了解,知道是否使用错索引
rows
根据表统计信息及索引选用情况,估算找到所需的记录需要取的行数
extra
一些额外的补充信息,包括但不限一下几种
-
using index: 表示使用索引覆盖。
-
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
-
Using filesort:MySQL会对结果使用一个外部索引排序。而不是按索引次序从表里读取。
-
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进。