mysql为什么回表会慢

当过滤后的数据量较大时,回表带来的海量随机 I/O成本会呈指数级上升。这也是为什么有时候明明加了索引,查询反而比全表扫描还要慢的原因

随机IO

因为它会产生随机磁盘IO

非聚簇索引的叶子节点只存储索引列的值和对应的主键ID,当需要回表时,数据库必须拿着主键ID去聚簇索引查找完整数据。

虽然二级索引中匹配的记录,可能是挨在一起的,但是他们对应的主键ID在物理磁盘上往往是不连续的。

每次拿着主键去主键树查数据,都可能触发一次独立的磁盘寻道,在机械硬盘下,单次随机IO耗时可能高达10ms以上,固态硬盘下,延迟也会显著增加。如果查询返回1万条数据,就可能触发1万次随机IO,比直接顺序全表扫描还慢。

内存缓冲池命中率下降

回表操作需要同时加载二级索引页和聚簇索引页到内存中,由于回表的数据在物理页上不连续,会大量占用缓冲池的空间,导致其他高频查询的缓存命中率大幅下降,进而引发整体数据库性能的退化。

排序和临时表

回表查出的完整数据需要参与排序操作时,数据库将无法利用索引本身的有序性 ,会强制触发 内存或磁盘级别的二次排序(using fileSort ),进一步消耗CPU和IO

高并发性能雪崩

高并发场景下,大量请求触发回表,会导致磁盘IO队列深度激增,数据库连接池被慢查询占满,请求排队超时,最终引发整个服务不可用

相关推荐
`Levie20 分钟前
MySQL-数据库服务日志管理与数据闪回
数据库·mysql
香蕉大香蕉(06敬畏市场)23 分钟前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
ShineWinsu37 分钟前
对于Qt:QCheckBox常见属性的详细解析
c++·qt·面试·笔试·gui·qcheckbox·多选框
师夷长技以自愈1 小时前
第 3 讲:多 Agent——Supervisor 分诊 + 专职 Worker
面试
吹什么轩1 小时前
MySQL 事务管理:从 ACID 到 MVCC,一篇讲透
数据库·mysql
怕浪猫1 小时前
我有个朋友,工作八年,公司从 300 人减到 80 人
面试·程序员
考研保研资料分享1 小时前
2024财会跨保北大金融科技:三场笔面试与经管法混申复盘
科技·面试·金融
paopaokaka_luck2 小时前
基于springboot+vue的益暖微光公益服务平台(DeepSeek公益助手、善款信息追溯、志愿服务积分闭环、ECharts运营分析、活动状态自动流转)
java·前端·javascript·spring boot·mysql·架构·echarts
m0_639906942 小时前
MySQL 锁机制详解|表锁、行锁、意向锁,死锁成因与解决方案
数据库·mysql
进击的荆棘2 小时前
MySQL——在ubuntu环境下安装MySQL
数据库·mysql·ubuntu