Explaing各个字段的含义

发布时间:2026/8/16 6:39:08
Explaing各个字段的含义 EXPLAIN是数据库性能调优的“第一手工具”它的输出结果就像一份医生出具的“体检报告”告诉你 SQL 语句到底是怎么执行的。在 MySQL 中标准的EXPLAIN输出包含12 个字段不同版本可能略有差异比如 MySQL 8.0 新增了Partitions等。我按重要性从高到低把最核心的字段给你拆解清楚1.id查询序号含义SQL 执行的顺序编号。解读id相同执行顺序由上到下。id不同id 值越大优先级越高越先被执行比如子查询。id为NULL表示这是一个临时表如 UNION 结果通常最后执行。2.select_type查询类型——最重要的判断依据之一表示这条语句是简单查询还是复杂查询它直接影响你对执行计划的理解。常见值含义好不好SIMPLE简单查询没有子查询或 UNION✅ 最好说明没嵌套PRIMARY最外层的查询或 UNION 中的第一个正常SUBQUERY子查询SELECT嵌套在WHERE中⚠️ 小心可能影响性能DERIVED派生表FROM子句中的子查询⚠️ 会生成临时表开销大UNIONUNION 中第二个或之后的查询正常UNION RESULT从 UNION 临时表中读取结果正常重点关注SUBQUERY和DERIVED它们往往是性能瓶颈的征兆。3.table表名显示这一行是关于哪张表的。如果是derivedN或unionM,N表示是派生表或合并结果的临时表。4.type访问类型——最重要没有之一它告诉你 MySQL 是如何查找数据的性能从最好到最差依次是systemconsteq_refrefrangeindexALL常见值含义性能评价system表只有一行系统表 极品const通过主键或唯一索引命中最多返回一行 极优完美eq_ref连接查询时使用主键或唯一索引作为连接条件 优秀ref使用普通索引非唯一匹配到多行 良好常见range使用索引进行范围扫描如BETWEEN、、IN 还行可接受index扫描整个索引树比全表快但仍是全量扫描⚠️ 慢索引覆盖扫描ALL全表扫描不走任何索引 性能杀手必须优化底线目标至少达到range最好能达到ref或const。如果看到ALL99% 需要加索引。5.possible_keys可能使用的索引查询时 MySQL 认为可能会用到的所有索引。但这只是“候选名单”不一定会真正使用。6.key实际使用的索引——核心优化依据这是真正被 MySQL 选择使用的索引名称。如果为NULL说明没走索引通常对应typeALL。注意有时候possible_keys有值但key为NULL说明 MySQL 优化器判断走索引成本比全表扫描还高比如数据量太少这时不一定是坏事。7.key_len使用的索引长度表示 MySQL 在索引中实际使用的字节数。这个值可以帮你判断联合索引到底用了多少列。例子key_len4说明用了 4 个字节比如int类型key_len8说明可能用了两个int列或者一个bigint。用途如果你创建了联合索引(a, b, c)但key_len只显示用了a的长度说明只部分使用了索引需要检查查询条件是否满足最左前缀。8.ref索引的引用对象显示key列中的索引具体是和哪个值做比较的。常见值const表示和常量比较如where id 1db.table.column表示和另一张表的某个列比较如连接查询9.rows预估扫描行数——性能预估核心MySQL 估计为了找到结果需要扫描的行数。这个值越小越好它是一个估算值不是精确值。核心调优逻辑如果rows很大比如几十万但typeref说明索引生效了但符合条件的数据确实很多可能需要从业务层面优化如分页。10.filtered过滤百分比表示存储引擎返回的数据中满足WHERE条件的百分比估算值。越大越好100% 最优。例子rows1000, filtered50%表示预估扫描 1000 行其中大约 500 行会被最终返回给客户端。11.Extra额外信息——魔鬼在细节里这列包含很多额外信息有些是好消息有些是警告。你需要重点关注这几个关键词Extra 信息含义影响Using index覆盖索引只读取索引不回表✅最优性能极好Using where使用了 WHERE 条件过滤数据正常需配合索引Using index condition索引条件下推ICP 优化 好MySQL 5.6 特性Using temporary使用了临时表常见于 GROUP BY、DISTINCT⚠️警告需要优化Using filesort需要额外排序无法用索引直接排序⚠️警告需要优化Using join buffer连接查询时使用了缓冲区没走索引⚠️警告急需加索引Impossible WHEREWHERE 条件永远为假逻辑错误红色警报见到Using temporary或Using filesort通常代表需要优化 SQL 或增加索引。12.Partitions分区信息MySQL 5.7如果表做了分区会显示命中了哪些分区如果未分区则为NULL。主要用于分区表的查询分析。总结一张“优化优先级”图当你拿到一条EXPLAIN结果时按这个顺序去看先看type有没有ALL有就立即优化。再看key是不是NULL是就建索引。然后看rows估算行数是否异常大比预期大一个数量级。最后看Extra有没有Using temporary或Using filesort有就调整索引或改写 SQL。如果都正常再看key_len确认联合索引是否充分利用。