MySQL 索引与执行计划:从 EXPLAIN 看懂慢查询

434 字
2 分钟
MySQL 索引与执行计划:从 EXPLAIN 看懂慢查询
MySQL 索引与执行计划:从 EXPLAIN 看懂慢查询

慢查询是后端工程师绕不开的话题。排查的第一步,永远是 EXPLAIN。

读懂 EXPLAIN#

EXPLAIN SELECT id, name FROM user WHERE age = 25 AND city = 'Shanghai';

重点关注几列:

  • type:访问方式。从好到差大致是 const > ref > range > index > ALL。出现 ALL 意味着全表扫描。
  • key:实际使用的索引。
  • rows:预估扫描行数,越小越好。
  • Extra:Using index 表示覆盖索引;Using filesort、Using temporary 需要警惕。

最左前缀原则#

联合索引 (city, age, name) 可以支撑:

  • WHERE city = ?
  • WHERE city = ? AND age = ?
  • WHERE city = ? AND age = ? AND name = ?

但无法有效支撑只写 age 或 name 的查询。设计联合索引时,把区分度高、使用频率高的列放在前面。

覆盖索引#

如果查询的列都在索引里,MySQL 不需要回表:

-- 索引 (city, age, name)
SELECT city, age, name FROM user WHERE city = 'Shanghai';

回表是随机 IO,能避免就避免。

常见的索引失效场景#

  1. 对索引列使用函数或运算:WHERE DATE(create_time) = '2026-01-01'。
  2. 隐式类型转换:字符串列用数字去比较。
  3. 以通配符开头的模糊查询:LIKE '%abc'。
  4. OR 连接的条件中,有一边没有索引。
  5. 联合索引没有遵循最左前缀。

分页深翻页#

-- 慢:需要扫描并丢弃前 100 万行
SELECT * FROM orders ORDER BY id LIMIT 1000000, 20;
-- 快:利用上一页的最后一个 id
SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 20;

小结#

优化的流程很朴素:先定位慢 SQL,再看执行计划,然后调整索引或改写查询,最后用真实数据验证。不要为了加索引而加索引,每个索引都会拖慢写入、占用空间。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

MySQL 索引与执行计划:从 EXPLAIN 看懂慢查询
https://www.s9mc.cn/posts/mysql-index-explain/
作者
南柯一梦
发布于
2026-09-05
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
南柯一梦
三年 Java 后端 · 十二年 MC 服主 · AI 驱动开发
公告
欢迎来到南柯一梦!这里记录 Java、Minecraft 服务器与 AI 的折腾日常。
分类
标签
最新动态
站点统计
文章
6
分类
3
标签
17
总字数
2,494
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录
微信二维码
微信扫码添加
QQ:1649721249