explain能做什么
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
基本语法
1 | explain select select_options |
explain语句输出的各列作用如下
列名 | 描述 |
---|---|
id | 在一个大的查询语句中每个select关键字都对应一个唯一id |
select_type | select关键字对应的那个查询类型 |
table | 表名 |
partitions | 匹配到的分区信息 |
type | 针对单表的访问方法 |
possible_keys | 可能用到的索引 |
key | 实际上使用的索引 |
key_len | 实际上使用到的索引长度 |
ref | 当使用索引列等值查询时,与索引列进行等值匹配的对象信息 |
rows | 预估的需要读取的记录条数 |
filtered | 某个表经过搜索条件过滤后剩余记录条数的百分比 |
Extra | 一些额外的信息 |
select_type
type
重要指标
The type
column of EXPLAIN
output describes how tables are joined。
小结:
结果值从最好到最坏依次是: system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
SQL性能优化的目标:至少要达到range级别,要求是ref级别,最好是const级别(阿里巴巴开发手册要求)
system
- 当表中
只有一条记录
并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system
const
- 当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是
const
ref
- 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是
ref
eq_ref
- 在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则 对该被驱动表的访问方法就是
eq_ref
ref_or_null
- 当对普通二级索引进行等值匹配查询,该索引列的值也可以是
NULL
值时,那么对该表的访问方法就可能是ref_or_null
index_merge
- 单表访问方法时在某些场景下可以使用
Intersection
、Union
、Sort-Union`这三种索引合并的方式来执行查询
unique_subquery
unique_subquery
是针对在一些包含IN
子查询的查询语句中,如果查询优化器决定将IN
子查询转换为EXISTS
子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type
列的值就是unique_subquery
range
- 如果使用索引获取某些
范围区间
的记录,那么就可能使用到range
访问方法
index
- 当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是
index
ALL
- 最熟悉的全表扫描
possible_keys和key
可能用到的索引 和 实际上使用的索引
key_len
帮你检查是否充分的利用上了索引
,值越大越好
,主要针对于联合索引,有一定的参考意义。
ref
- 当使用索引列等值查询时,与索引列进行等值匹配的对象信息。
- 比如只是一个常数或者是某个列。
rows
预估的需要读取的记录条数,值越小越好
filtered
某个表经过搜索条件过滤后剩余记录条数的百分比
Extra
额外信息
官网
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
MySQL :: MySQL 8.0 Reference Manual :: 10.8.2 EXPLAIN Output Format