一、这是最容易让人"怀疑人生"的场景
你可能经历过:
-
explain 看起来很完美
-
索引走了
-
rows 不多
-
type 也正常
但 SQL 执行就是慢。
于是你开始:
-
怀疑 MySQL
-
怀疑索引
-
怀疑自己
但其实,你只看到了执行计划的一小部分。
二、Explain 只能告诉你"怎么查",不能告诉你"为什么慢"
Explain 关注的是:
-
索引选择
-
扫描方式
-
预估行数
但它看不到:
-
数据是否在内存
-
IO 等待
-
锁等待
-
资源竞争
也就是说:
Explain 正常 ≠ SQL 一定快
三、最常见的 4 种"Explain 看不出来的慢"
1️⃣ 数据不在 Buffer Pool 里
即使:
-
走了索引
-
扫描行数很少
如果每次都要读磁盘:
-
随机 IO
-
延迟直接放大
Explain 是不会告诉你:
这次查询读了多少次磁盘。
2️⃣ 锁等待导致的"假慢 SQL"
很多 SQL 本身很快,但在等锁:
-
等行锁
-
等表锁
-
等事务提交
Explain 看不到等待时间,只看到执行方式。
你看到的是慢 SQL,
实际上是慢在等别人。
3️⃣ 连接池和线程资源耗尽
当连接数接近上限:
-
新请求排队
-
老请求执行慢
你以为是 SQL 慢,
其实是根本轮不到它执行。
4️⃣ 执行计划"对,但环境不对"
例如:
-
索引是对的
-
SQL 是对的
-
但 CPU 被打满
-
IO 被占满
执行计划没错,但执行环境已经崩了。
四、为什么高峰期更容易出现这种问题?
因为在高峰期:
-
Buffer Pool 命中率下降
-
锁冲突增加
-
IO 排队加重
Explain 依然"正常",
但系统已经不正常了。
五、排查慢 SQL,不能只看 Explain
真正有效的排查,必须结合:
-
执行时间分布
-
锁等待
-
内存命中率
-
系统资源状态
Explain 只是入口,不是答案。
六、总结一句话
Explain 没问题,只能说明"方向没错",并不能保证"路况通畅"。
当 SQL 慢的时候,请把视角从"语句"抬高到"系统"。
免责声明
本回答基于网络公开信息整理,内容仅供参考。由于信息时效性和准确性可能存在差异,建议用户结合实际情况谨慎参考。对于因使用或依赖本回答内容而产生的任何直接或间接损失,不承担任何责任。如有专业需求,请咨询相关领域专家或权威机构。