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

相关推荐
gb421528726 分钟前
mysql数据库中某个数据表的碎片率自己降低了,mysql数据表对碎片率有自动优化机制吗?
数据库·mysql
shengjk11 小时前
序列化和反序列化:从理论到实践的全方位指南
java·大数据·开发语言·人工智能·后端·ai编程
有时间要学习1 小时前
MySQL——数据类型&&表的约束
数据库·mysql
weixin_473894772 小时前
前端服务器部署分类总结
前端·网络·性能优化
hie988942 小时前
使用Spring Boot集成Nacos
java·spring boot·后端
珹洺2 小时前
Jsp技术入门指南【十四】实现基于MySQL+JDBC+JSP数据库验证的登录界面与登录跳转功能
java·运维·数据库·mysql·servlet
JhonKI2 小时前
【MySQL】日志缓冲区详解 以及 InnoDB内存结构总结
数据库·mysql·oracle
源码方舟2 小时前
基于SpringBoot+Vue的房屋租赁管理系统源码包(完整版)开发实战
vue.js·spring boot·后端
景天科技苑2 小时前
【Rust trait特质】如何在Rust中使用trait特质,全面解析与应用实战
开发语言·后端·rust·trait·rust trait·rust特质
vvilkim3 小时前
MySQL视图:虚拟表的强大功能与应用实践
数据库·mysql