MySQL 索引与执行计划:从 EXPLAIN 看懂慢查询
434 字
2 分钟
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,能避免就避免。
常见的索引失效场景
- 对索引列使用函数或运算:
WHERE DATE(create_time) = '2026-01-01'。 - 隐式类型转换:字符串列用数字去比较。
- 以通配符开头的模糊查询:
LIKE '%abc'。 OR连接的条件中,有一边没有索引。- 联合索引没有遵循最左前缀。
分页深翻页
-- 慢:需要扫描并丢弃前 100 万行SELECT * FROM orders ORDER BY id LIMIT 1000000, 20;
-- 快:利用上一页的最后一个 idSELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 20;小结
优化的流程很朴素:先定位慢 SQL,再看执行计划,然后调整索引或改写查询,最后用真实数据验证。不要为了加索引而加索引,每个索引都会拖慢写入、占用空间。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
MySQL 索引与执行计划:从 EXPLAIN 看懂慢查询
https://www.s9mc.cn/posts/mysql-index-explain/相关文章智能推荐
1
Java 虚拟线程实战:用同步写法扛住十万并发
Java虚拟线程让「一请求一线程」重新变得可行。本文从原理、用法到踩坑,讲清楚它在后端服务里该怎么用。
2
Spring Boot 优雅停机:发布时不再丢请求
Java讲清楚 Spring Boot 的优雅停机机制,以及在 Kubernetes 与负载均衡下如何配合,做到发布零报错。
3
Redis 分布式锁:从 SETNX 到 Redisson 的坑
Java一把分布式锁要考虑的事情远比想象中多:原子性、过期时间、误删、续期。本文逐个拆解。
4
开了十二年服,我总结的 Paper 服务器调优清单
Minecraft从 JVM 参数到区块加载,从实体清理到定时任务,一份来自十二年运维经验的 Minecraft 服务器调优清单。
5
和 AI 结对编程:我的日常工作流
AI不是让 AI 替你写代码,而是让它成为你的搭档。分享我在日常开发中使用 AI 工具的几条原则与技巧。
随机文章随机推荐









