MySQL EXPLAIN 与慢 SQL 优化入门
知识背景
线上接口慢,常见根因是 SQL 全表扫描、索引未命中、排序文件排序、大 offset 分页。MySQL 提供 EXPLAIN / EXPLAIN ANALYZE(高版本) 查看优化器选择的访问路径。
Java 侧无论 MyBatis 还是 MP,最终都是 SQL;会看执行计划才能把慢查询从「凭感觉加索引」变成「有据可查」。
知识详解与通俗解释
1. EXPLAIN 核心列(记这些先够用)
type:访问类型,从差到好常见ALL(全表)→index→range→ref→eq_ref→const。ALL往往是优化重点。key:实际使用的索引。rows:预估扫描行数(估算值)。Extra:如Using filesort、Using temporary、Using index(覆盖索引,通常好事)。
2. 典型优化手段
- WHERE / JOIN ON 列建合适索引;联合索引顺序贴合最左前缀。
- 避免
SELECT *:减少回表与网络,利于覆盖索引。 - 深分页:
LIMIT100000, 20成本高,可改为 上次最大 id 游标 方式。 - 批量操作:减少交互次数;注意事务大小与锁范围。
3. 慢查询日志
开启 slow query log,结合 long_query_time 抓真实慢 SQL,再在测试环境 EXPLAIN。生产改索引前务必评估写入与存储成本。
4. MP 场景提示
selectPage 若 WHERE 无法走索引,分页再方便也慢;Wrapper 里乱 like '%xx%' 容易导致索引失效。
总结
- EXPLAIN 是 SQL 优化的「体检单」:
type、key、rows、Extra优先看。 - 优化三板斧:合适索引、减少扫描行、避免大 offset 与大排序。
- ORM 只是生成 SQL 的工具,性能责任仍在语句与表结构。