Skip to content
MySQL 建模与查询优化 · 第 3 篇 / 共 6 篇
领域数据与中间件
专题MySQL 专题
当前序列MySQL 建模与查询优化
阅读位置第 3 篇 / 共 6 篇当前专题第 1 个序列 / 共 7 个序列

MySQL Explain 实战:type、key、rows、extra 到底先看哪个

EXPLAIN 几乎是 MySQL 排查查询性能时必看的工具。

但很多人第一次看它时会觉得:

  • 列很多
  • 信息很多
  • 不知道先看哪一个

先说结论

对大多数业务排查来说,更实用的阅读顺序通常是:

  1. key
  2. type
  3. rows
  4. Extra

也就是先看:

  • 用了什么索引
  • 扫描方式如何
  • 预估扫多少行
  • 有没有临时表、文件排序、覆盖索引等信号

一、为什么不要一上来背所有列

因为慢 SQL 排查最重要的是快速抓住问题方向,而不是把所有 explain 列都背下来。

很多时候真正关键的信息只集中在少数几列里。

二、key:先看用没用对索引

key 很直观:

  • 它告诉你最终用了哪个索引

如果一个高频查询本来就应该走某个索引,但这里显示:

  • 没用索引
  • 或用的是不理想的索引

那就已经很值得重点看了。

三、type:再看扫描方式

type 可以粗略反映:

  • 当前这条 SQL 的访问方式是不是比较“笨重”

不用死记所有类型,但要形成一个直觉:

  • 越偏全表、大范围扫描,通常越需要警惕

四、rows:预估扫描行数很关键

这一列经常特别有用。

如果你只是查几十条数据,但 rows 显示要扫十几万、几十万行,那慢的根因往往已经呼之欲出了。

五、Extra:这里最容易看到“危险信号”

尤其可以重点留意:

  • Using filesort
  • Using temporary
  • Using index

这些并不一定代表“绝对错误”,但能帮助你快速判断:

  • 排序是不是额外开销大
  • 是否用了临时表
  • 是否命中覆盖索引

六、一个更实际的使用方法

不要把 explain 当成“理论工具”,而要把它当成:

  • SQL 写法和执行结果之间的翻译器

更好的习惯是:

  • 改一版 SQL
  • 看 explain
  • 对比扫描路径有没有变

一句话总结

看 explain 最重要的不是背全,而是先抓关键字段:

  • key
  • type
  • rows
  • Extra

把这几个看顺了,慢 SQL 排查效率会高很多。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读MySQL 分页优化适合先把字段设计、索引、Explain、分页和慢 SQL 这条主线走顺。MySQL 专题 · MySQL 建模与查询优化同一序列 · 顺着当前主线继续读SQL 开窗函数入门适合先把字段设计、索引、Explain、分页和慢 SQL 这条主线走顺。MySQL 专题 · MySQL 建模与查询优化同专题其他序列 · MySQL 变更与运维治理大表在线 DDL 怎么做更稳适合把计数、日志、在线变更和归档清理放在一起看。MySQL 专题 · MySQL 变更与运维治理同专题其他序列 · MySQL 变更治理与数据生命周期大事务为什么会拖垮数据库适合把大事务、DDL、回填、慢 SQL 治理和归档分层放进一条持续治理主线上看。MySQL 专题 · MySQL 变更治理与数据生命周期跨专题关联 · 同场景:基础学习发布确认、Return 和 Mandatory 怎么配合适合把 Exchange、队列模型、投递确认和消费确认放在一起理解。RabbitMQ 专题 · RabbitMQ 核心模型与确认链路跨专题关联 · 同场景:基础学习ClickHouse 明细层、汇总层与 TTL 实战适合把物化视图、去重更新、TTL 和宽表分层这些建模问题放在一条线上看。ClickHouse 专题 · ClickHouse 预聚合与分层治理
继续阅读MySQL 建模与查询优化当前序列第 3 篇 / 共 6 篇当前专题第 1 个序列 / 共 7 个序列
往前看
上一篇MySQL 索引设计与慢 SQL 排查回到当前序列上一章上一序列设计模式与结构抽象从第 1 篇开始:设计模式总览
往后看
下一篇MySQL 分页优化继续当前序列下一章下一序列MySQL 事务、锁与高可用从第 1 篇开始:MySQL 事务与锁

把零散经验整理成可查、可复用、可持续更新的企业级知识门户