MySQL Explain 指南
简介
mysql explain
(或desc
)用于分析 SQL 语句的执行计划,通常用于测试查询性能。基本语法:
explain <sql语句>
注意事项
- 使用
explain
执行 DML 语句时,数据不会发生变化。 explain
的结果可能包含多行数据,每行对应一个表。若涉及union
操作,MySQL 会创建临时表,导致结果中多出一行。union all
不会创建临时表,因此结果行数不会增加。
字段解析
id
id
是查询的标识符,值越大优先级越高:
- 对于多表
join
,因为只涉及一个select
,id
会重复。 - 在子查询中,MySQL 优化器可能将子查询转换为
join
,导致所有select
的id
为 1。 - 若涉及
union
,临时表的id
值为null
。
select_type
表示查询类型,主要包括:
- SIMPLE:简单查询,不包含
union
或子查询。 - PRIMARY:主查询,复杂查询的最外层查询,或
union
中左侧表。 - SUBQUERY:独立子查询。
- DEPENDENT SUBQUERY:依赖外部查询的子查询。
- DERIVED:派生表,从查询结果派生的临时表(
from
后的子查询)。 - UNION:
UNION
查询中的子查询类型。 - UNION RESULT:
UNION
查询的结果集。 - DEPENDENT UNION:依赖外部查询的
UNION
查询。 - UNCACHEABLE SUBQUERY:不可缓存的子查询。
- UNCACHEABLE UNION:不可缓存的
UNION
查询。
table
表示操作的表类型和名称,包括:
- 实际表名:SQL 中直接引用的表。
<derivedN>
:派生表。<unionM-N>
:UNION
查询中的结果集。<temporary>
:临时表。<subqueryN>
:子查询结果。
partitions
显示查询使用的分区,有助于分析查询优化器选择的分区。
type
返回查询使用的访问方法,与索引相关:
- system:用于仅含一条记录的表。
- const:使用主键或唯一索引的等值匹配。
- eq_ref:使用主键或唯一索引的
join
。 - ref:使用非唯一索引的等值匹配。
- range:索引列的范围匹配。
- index:扫描整个索引树,常见于覆盖索引。
- ALL:全表扫描。
不常见类型
- fulltext:全文索引。
- ref_or_null:等值匹配且条件包含
or null
。 - index_merge:使用多个单列索引。
- unique_subquery 和 index_subquery:使用子查询索引。
possible_keys
列出根据 where
或 group by
字段可能使用的索引,实际执行时未必会使用这些索引。
key
表示实际选择的索引。
keylen
索引字段的最大长度,单位为字节。对于联合索引,该值有参考意义。
ref
索引列的等值匹配对象,主要用于性能分析。
rows
预估需扫描的行数,值越小越好,范围越精准查找越快。
filtered
表示表行按条件过滤后的估计百分比,越高越好,最大值为100。
Extra
备注信息,包括:
- Using temporary:使用
union
创建的临时表。 - Using index:使用覆盖索引。
- Using where:通过
where
过滤数据。 - Using filesort:对结果集进行文件排序。
- Using join buffer:使用连接缓冲区。
- Impossible WHERE:
where
条件恒为false
,查询返回空集。 - Select tables optimized away:优化跳过了不必要的表。
- Full table scan:进行全表扫描。
- Using index condition:使用索引下推。
- Using index for group-by 和 order by:索引用于分组和排序。
- Distinct、Order by 等其他操作描述。
扩展
explain
支持 JSON 格式输出,可使用以下语法:
explain format=json <sql语句>
评论区