【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的值,可以直接返回结果,不需要回表。这种情况下,索引覆盖了查询需求,称为覆盖索引,避免了回表操作,提升效率。

相关推荐
NineData14 分钟前
NineData 最新发布 SQL Server 双向实时同步功能
数据库·后端·架构
IT果果日记16 分钟前
没有Kafka怎么办?Flink SQL 创建 mysql-cdc 作业
大数据·后端·flink
Goboy23 分钟前
入坑了,都是2e31惹得锅
后端
Java水解27 分钟前
深入剖析Spring IOC容器——原理、源码与实践全解析
后端·spring
绝无仅有28 分钟前
Go 语言常用命令使用与总结
后端·面试·github
手握风云-31 分钟前
MySQL数据库精研之旅第十一期:打造高效联合查询的实战宝典(二)
数据库·mysql
Code_Artist33 分钟前
[Java并发编程]6.并发集合类:ConcurrentHashMap、CopyOnWriteArrayList
java·后端·源码阅读
码事漫谈36 分钟前
深入解析:为什么应该避免使用 atoi、atol 和 atof 函数
后端
码事漫谈1 小时前
现代C++工具链实战:CMake + Conan + vcpkg依赖管理
后端
杨杨杨大侠1 小时前
第6篇:链路追踪系统 - 分布式环境下的请求跟踪
java·后端·apache log4j