【MySQL 优化】什么是回表?什么是索引覆盖?

回表概念

InnoDB使用的是聚簇索引,也就是数据行实际存储在聚簇索引的叶子节点里。

而普通索引,也就是二级索引,它们的叶子节点存储的是主键的值。所以当使用二级索引进行查询时,如果需要的字段不在索引中,就需要根据主键值回到聚簇索引中查找完整的数据行,这个过程就是回表。

每次回表都是一次额外的磁盘I/O操作,尤其是当数据量大的时候,多次回表会导致查询变慢。所以在优化的时候,尽量减少回表次数,比如使用覆盖索引,或者调整查询的字段,让需要的列都在索引里。

  • 举个例子

    比如有一个用户表,主键是id,还有一个普通索引在age字段上。如果执行一个查询SELECT * FROM user WHERE age=20,这时候会先通过age索引找到对应的主键id,然后再用这些id去主键索引里获取完整的行数据。这个过程就是回表。

索引覆盖

当查询的字段都包含在索引中,可能就不需要回表了。比如SELECT id, age FROM user WHERE age=20,这时候age索引的叶子节点已经包含了id和age的值,可以直接返回结果,不需要回表。这种情况下,索引覆盖了查询需求,称为覆盖索引,避免了回表操作,提升效率。

相关推荐
Chaney不会代码几秒前
Java7/8中的HashMap深挖
后端
宋大水3 分钟前
【大作业-12】草莓成熟度检测模型,YOLO+PyQt+MySQL
数据库·深度学习·mysql·yolo·目标检测·pyqt·课程设计
新程快咖员5 分钟前
兄弟们,你们安装IDEA 2025.2了吗?java编辑器代码提示失效?临时解决方案新鲜出炉!
后端·intellij idea
_代号00711 分钟前
MySQL梳理四:事务日志机制和多版本并发控制(MVCC)
mysql
调试人生的显微镜17 分钟前
移动端网页调试实战,跨设备兼容与触控交互问题排查全流程
后端
onejason40 分钟前
《PHP 爬虫实战指南:获取淘宝店铺详情》
前端·后端·php
码事漫谈1 小时前
你的代码可能在偷偷崩溃!
后端
dylan_QAQ1 小时前
【附录】Spring容器的启动过程是怎样的?
后端·spring
白应穷奇1 小时前
编写高性能数据处理代码 02
后端·python
这个做不了1 小时前
基于模板方法与工厂模式的多支付公司/产品接入方案
后端