Explain 没问题,SQL 却很慢,为什么?

一、这是最容易让人"怀疑人生"的场景

你可能经历过:

  • 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 慢的时候,请把视角从"语句"抬高到"系统"。

免责声明

本回答基于网络公开信息整理,内容仅供参考。由于信息时效性和准确性可能存在差异,建议用户结合实际情况谨慎参考。对于因使用或依赖本回答内容而产生的任何直接或间接损失,不承担任何责任。如有专业需求,请咨询相关领域专家或权威机构。

相关推荐
Hardworking6667 小时前
第7章 软硬件系统集成
数据库·软硬件系统集成
名字还没想好☜8 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
熊猫钓鱼>_>8 小时前
Redis 突发缓存穿透:一次完整的定位复盘
数据库·人工智能·redis·缓存·ai·agent·智能
wenb1n8 小时前
MySQL诊断系列(3/6):索引分析——5个SQL揪出“僵尸索引”
数据库·人工智能·编程语言
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章03:向量相似度算法全解:余弦、欧氏、内积,到底该用哪个?
大数据·数据库·人工智能·算法·机器学习·向量相似度·高炉炼铁
ClouGence10 小时前
CloudDM 数据库管理平台,全新 UI,更清晰、更高效!
数据库·开源
花生了什么事o12 小时前
DDD:领域驱动设计的初步认识
java·数据库
BGK11235812 小时前
基于qemu_v8+optee 4.00 平台构建 ca/ta
java·大数据·数据库
OneNobody13 小时前
Spark SQL AQE工作原理源码剖析
大数据·sql·spark
何中应13 小时前
Spring Boot整合Doris
java·数据库·spring boot