目 录CONTENT

文章目录

MySQL Explain 指南

在等晚風吹
2024-11-08 / 0 评论 / 0 点赞 / 8 阅读 / 0 字 / 正在检测是否收录...

MySQL Explain 指南

简介

mysql explain(或desc)用于分析 SQL 语句的执行计划,通常用于测试查询性能。基本语法:

explain <sql语句>

注意事项

  • 使用 explain 执行 DML 语句时,数据不会发生变化。
  • explain 的结果可能包含多行数据,每行对应一个表。若涉及 union 操作,MySQL 会创建临时表,导致结果中多出一行。
  • union all 不会创建临时表,因此结果行数不会增加。

字段解析

id

id 是查询的标识符,值越大优先级越高:

  • 对于多表 join,因为只涉及一个 selectid 会重复。
  • 在子查询中,MySQL 优化器可能将子查询转换为 join,导致所有 selectid 为 1。
  • 若涉及 union,临时表的 id 值为 null

select_type

表示查询类型,主要包括:

  • SIMPLE:简单查询,不包含 union 或子查询。
  • PRIMARY:主查询,复杂查询的最外层查询,或 union 中左侧表。
  • SUBQUERY:独立子查询。
  • DEPENDENT SUBQUERY:依赖外部查询的子查询。
  • DERIVED:派生表,从查询结果派生的临时表(from 后的子查询)。
  • UNIONUNION 查询中的子查询类型。
  • UNION RESULTUNION 查询的结果集。
  • 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_subqueryindex_subquery:使用子查询索引。

possible_keys

列出根据 wheregroup by 字段可能使用的索引,实际执行时未必会使用这些索引。

key

表示实际选择的索引。

keylen

索引字段的最大长度,单位为字节。对于联合索引,该值有参考意义。

ref

索引列的等值匹配对象,主要用于性能分析。

rows

预估需扫描的行数,值越小越好,范围越精准查找越快。

filtered

表示表行按条件过滤后的估计百分比,越高越好,最大值为100。

Extra

备注信息,包括:

  • Using temporary:使用 union 创建的临时表。
  • Using index:使用覆盖索引。
  • Using where:通过 where 过滤数据。
  • Using filesort:对结果集进行文件排序。
  • Using join buffer:使用连接缓冲区。
  • Impossible WHEREwhere 条件恒为 false,查询返回空集。
  • Select tables optimized away:优化跳过了不必要的表。
  • Full table scan:进行全表扫描。
  • Using index condition:使用索引下推。
  • Using index for group-byorder by:索引用于分组和排序。
  • DistinctOrder by 等其他操作描述。

扩展

explain 支持 JSON 格式输出,可使用以下语法:

explain format=json <sql语句>
0

评论区