id
表示select 查询的序列号
当 id 相同时,执行顺序自上而下。(表连接)
当 id 不同时,id 越大,优先级越大,越先执行。(子查询)
select_type
表示查询的类型,常见的值有:
- SIMPLE: 简单查询,不包含union或者子查询
- PRIMARY: 如果查询中包含子查询或者其他部分,外层的select将被标记为primary
- SUBQUERY: 子查询中出现的第一个select
- UNION: 在union语句中,union之后出现的select
- DERIVED: 在from中出现的子查询将被标记为 derived
- UNION REDULT: union查询的结果
table
当前查询的表
partitions
查询涉及到的分区,对于未分区的表,值为null
type
查询执行的类型,描述了查询是如何执行的,
system > const > eq_ref > ref > range > index > ALL
system: 表中只有一行数据,是const的一种特例
const: 表中最多只有一行匹配的记录,一次查询就能找到,查用于使用主键或唯一索引做查询条件,比如
explain select * from team where id = 1;
eq_ref: 当连表查询时,前一张表的行在当前表中只有一行匹配。是除了system和const之外最好的join方法,常用于主键或唯一索引做连接条件
ref: 使用普通索引做·查询条件,查询条件可能找到多个符合条件的行
range: 对索引列进行范围查询,
index: 查询遍历了整个索引树,与ALL类似,只不过扫描的是索引,而索引一般在内存中,速度更快
ALL: 遍历全表,读磁盘,速度最慢
possible_keys
查询中可能使用到的索引
key
查询中实际使用的索引,如果为null,则表示未建立索引或索引失效
ref
表示查询索引时,哪些列或者常量被用来与索引的值进行比较
rows
mysql估算出的查询需要遍历的行数,越少越好
filtered
实际筛选出的列数 = rows * filtered
Extra
额外信息,特别注意,当 Extra
列包含 Using filesort
或 Using temporary
,MySQL 的性能会存在问题,需要尽可能避免。
常见信息如下:
Using filesort: 使用了外部排序,没有使用索引排序
Using temporary: MySQL需要创建临时表来存储查询的结果,常见于 order by 和 group by
Using index: 查询时使用了覆盖索引,不用回表,查询效率非常高
Using where: 使用了where子句进行条件过滤,一般在没有使用到索引的时候会出现
Impossible WHERE: where子句的结果总是false且无法查到任意行