MySQL Explain 指南

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_subqueryindex_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-byorder by:索引用于分组和排序。
  • DistinctOrder by 等其他操作描述。
相关推荐
安当加密35 分钟前
MySQL数据库透明加密(TDE)解决方案:基于国密SM4的合规与性能优化实践
数据库·mysql·性能优化
007php0071 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
JH30731 小时前
第七篇:Buffer Pool 与 InnoDB 其他组件的协作
java·数据库·mysql·oracle
板凳坐着晒太阳1 小时前
ClickHouse 配置优化与问题解决
数据库·clickhouse
数据库生产实战1 小时前
解析Oracle 19C中并行INSERT SELECT的工作原理
数据库·oracle
AAA修煤气灶刘哥2 小时前
服务器指标多到“洪水泛滥”?试试InfluxDB?
数据库·后端·面试
阿沁QWQ3 小时前
MySQL服务器配置与管理
服务器·数据库·mysql
程序新视界4 小时前
MySQL“索引失效”的隐形杀手:隐式类型转换,你了解多少?
数据库·mysql·dba
Logintern094 小时前
windows如何设置mongodb的副本集
数据库·windows·mongodb
XYiFfang5 小时前
【MYSQL】SQL学习指南:从常见错误到高级函数与正则表达式
sql·mysql·正则表达式·regexp_like·group_concat