MySQL Explain 指南
- id
- select_type
- table
- partitions
- type
- possible_keys
- key
- keylen
- ref
- rows
- filtered
- Extra
- 使用 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 等其他操作描述。