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

免责声明

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

相关推荐
品牌常新10 分钟前
室外巡检机器人推荐:园区与厂区怎么选
数据库·人工智能·机器人
snow@li12 分钟前
redis:RedisDesktopManager(RDM/RESP.app)Redis 数据可视化全景深度梳理
数据库·redis·缓存
lqbzlll13 分钟前
MySQL 慢查询日志开了但看不懂?从 slow_query_log 到 EXPLAIN ANALYZE 一步步定位
数据库·mysql·adb
code_slave(码畜)22 分钟前
微服务架构落地:慢 SQL 治理与连接池调优 —— 守住数据库的最后一道防线
数据库·spring boot·sql·spring cloud·微服务·架构
IvorySQL37 分钟前
PostgreSQL 日报|子表 CHECK 约束恢复标记错误(11 月 2 日)
数据库·postgresql
你看我名字1 小时前
Redis 高可用、持久化与故障切换:从缓存组件到云上基础设施
数据库·redis·缓存
风翼靓崽2 小时前
centos7以mysql为例自建yum源
数据库·mysql·adb
码农阿豪2 小时前
MongoDB迁移到金仓数据库:商品属性继续灵活存,订单报表交给 SQL
数据库·sql·mongodb
秋饼2 小时前
Redis 全面解析:从数据结构到主从/哨兵/集群、分布式锁与面试高频考点,代码到原理一次讲透
数据库·redis·分布式·面试·后端开发