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

相关推荐
qq_2975746744 分钟前
【实战教程】SpringBoot 集成阿里云短信服务实现验证码发送
spring boot·后端·阿里云
银发控、1 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记1 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
AZ996ZA2 小时前
自学linux第十八天:【Linux运维实战】系统性能优化与安全加固精要
linux·运维·安全·性能优化
韩立学长2 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
霖霖总总4 小时前
[小技巧60]深入解析 MySQL Online DDL:MySQL Online DDL、pt-osc 与 gh-ost 机制与最佳实践
数据库·mysql
编码者卢布5 小时前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
怣506 小时前
[特殊字符] MySQL数据表操作完全指南:增删改查的艺术
数据库·mysql·adb
安然无虞7 小时前
「MongoDB数据库」初见
数据库·mysql·mongodb
Mr_Xuhhh7 小时前
MySQL视图详解:虚拟表的创建、使用与实战
数据库·mysql