MySQL Explain 指南

发布时间:2026/7/22 2:10:45
MySQL Explain 指南 MySQL Explain 指南idselect_typetablepartitionstypepossible_keyskeykeylenrefrowsfilteredExtra使用 explain 执行 DML 语句时数据不会发生变化。explain 的结果可能包含多行数据每行对应一个表。若涉及 union 操作MySQL 会创建临时表导致结果中多出一行。union all 不会创建临时表因此结果行数不会增加。idid 是查询的标识符值越大优先级越高对于多表 join因为只涉及一个 selectid 会重复。在子查询中MySQL 优化器可能将子查询转换为 join导致所有 select 的 id 为 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-NUNION 查询中的结果集。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 创建的临时表。group by/distinct 无法创建索引。 。Using index使用覆盖索引。Using where通过 where 过滤数据。Using filesort对结果集进行文件排序。优化时可以把 order by 列加入联合索引。Using join buffer使用连接缓冲区。Impossible WHEREwhere 条件恒为 false查询返回空集。Select tables optimized away优化跳过了不必要的表。Full table scan进行全表扫描。Using index condition使用索引下推。Using index for group-by和order by索引用于分组和排序。Distinct、Order by等其他操作描述。