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

免责声明

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

相关推荐
越甲八千几秒前
ORM 的优势
数据库·python
DBA小马哥2 分钟前
从“数据洪流”到“业务引擎”:时序数据库为何能重塑企业核心竞争力
数据库·时序数据库
fjkxyl19 分钟前
Redis 跳表技术博客:为什么不选用红黑树和 B+ 树
数据库·redis·缓存
张人玉25 分钟前
整合 Sugar ORM 连接 SQLite 数据库到 WPF 折线图项目
数据库·sqlite·c#·wpf
、BeYourself25 分钟前
PGvector :在 Spring AI 中实现向量数据库存储与相似性搜索
数据库·人工智能·spring·springai
a1879272183132 分钟前
MySQL 硬件优化和操作系统优化
数据库·mysql·优化·raid·numa·sysbench·系统参数
linweidong33 分钟前
hive sql行转列,列转行sql的实例
hive·hadoop·sql
只想早点退休的90后34 分钟前
sql面试题分享
数据库·sql
枫叶丹436 分钟前
【Qt开发】Qt系统(三)->事件过滤器
java·c语言·开发语言·数据库·c++·qt