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

免责声明

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

相关推荐
科技小花9 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸9 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain9 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希10 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神10 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员10 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java10 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿10 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴10 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU10 小时前
三大范式和E-R图
数据库