mysql为什么回表会慢

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

随机IO

因为它会产生随机磁盘IO

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

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

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

内存缓冲池命中率下降

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

排序和临时表

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

高并发性能雪崩

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

相关推荐
for_ever_love__14 分钟前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram
沐言人生1 小时前
又一个神级考公脑库-22,375篇真题终于按考点整理了
后端·面试
for_ever_love__1 小时前
MySQL 高频面试题 30 问:索引、事务、锁、日志、主从与分库分表(MySQL 8.0 版)
java·数据库·spring boot·mysql·spring cloud·面试·总结
救救孩子把2 小时前
Agent面试题-记忆治理-上下文-多Agent协作与工程落地
面试·agent·多agent·agent记忆·agent面试题·上下文治理
泡干脆面就番茄3 小时前
HDFS读写流程与MapReduce原理深度解析(面试高频考点)
hdfs·面试·mapreduce
bksczm3 小时前
0基础面试3
面试·职场和发展
java1234_小锋4 小时前
【技术专题】Mysql8 数据库 - Mysql8 触发器
数据库·mysql·mysql8
老王爱玩车5 小时前
动态内存管理
c语言·开发语言·学习·面试
海绵宝宝转agent5 小时前
2026-10-9 leetcode100刷题+面经整理
笔记·算法·面试
雨落在了我的手上6 小时前
MySQL数据库基础(6):增删改查操作(1)
数据库·mysql