公司动态

mysql为什么回表会慢

📅 2026/8/25 11:07:55
mysql为什么回表会慢
当过滤后的数据量较大时回表带来的海量随机 I/O成本会呈指数级上升。这也是为什么有时候明明加了索引查询反而比全表扫描还要慢的原因随机IO因为它会产生随机磁盘IO非聚簇索引的叶子节点只存储索引列的值和对应的主键ID当需要回表时数据库必须拿着主键ID去聚簇索引查找完整数据。虽然二级索引中匹配的记录可能是挨在一起的但是他们对应的主键ID在物理磁盘上往往是不连续的。每次拿着主键去主键树查数据都可能触发一次独立的磁盘寻道在机械硬盘下单次随机IO耗时可能高达10ms以上固态硬盘下延迟也会显著增加。如果查询返回1万条数据就可能触发1万次随机IO比直接顺序全表扫描还慢。内存缓冲池命中率下降回表操作需要同时加载二级索引页和聚簇索引页到内存中由于回表的数据在物理页上不连续会大量占用缓冲池的空间导致其他高频查询的缓存命中率大幅下降进而引发整体数据库性能的退化。排序和临时表回表查出的完整数据需要参与排序操作时数据库将无法利用索引本身的有序性会强制触发内存或磁盘级别的二次排序using fileSort)进一步消耗CPU和IO高并发性能雪崩高并发场景下大量请求触发回表会导致磁盘IO队列深度激增数据库连接池被慢查询占满请求排队超时最终引发整个服务不可用