Skip to content

MySQL EXPLAIN 与慢 SQL 优化入门

知识背景

线上接口慢,常见根因是 SQL 全表扫描、索引未命中、排序文件排序、大 offset 分页。MySQL 提供 EXPLAIN / EXPLAIN ANALYZE(高版本) 查看优化器选择的访问路径。
Java 侧无论 MyBatis 还是 MP,最终都是 SQL;会看执行计划才能把慢查询从「凭感觉加索引」变成「有据可查」。


知识详解与通俗解释

1. EXPLAIN 核心列(记这些先够用)

  • type:访问类型,从差到好常见 ALL(全表)→ indexrangerefeq_refconstALL 往往是优化重点。
  • key:实际使用的索引。
  • rows:预估扫描行数(估算值)。
  • Extra:如 Using filesortUsing temporaryUsing index(覆盖索引,通常好事)。

2. 典型优化手段

  • WHERE / JOIN ON 列建合适索引;联合索引顺序贴合最左前缀
  • 避免 SELECT *:减少回表与网络,利于覆盖索引。
  • 深分页LIMIT100000, 20 成本高,可改为 上次最大 id 游标 方式。
  • 批量操作:减少交互次数;注意事务大小与锁范围。

3. 慢查询日志

开启 slow query log,结合 long_query_time 抓真实慢 SQL,再在测试环境 EXPLAIN。生产改索引前务必评估写入与存储成本

4. MP 场景提示

selectPageWHERE 无法走索引,分页再方便也慢;Wrapper 里乱 like '%xx%' 容易导致索引失效。


总结

  • EXPLAIN 是 SQL 优化的「体检单」:typekeyrowsExtra 优先看。
  • 优化三板斧:合适索引、减少扫描行、避免大 offset 与大排序
  • ORM 只是生成 SQL 的工具,性能责任仍在语句与表结构