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

相关推荐
qiuyuyiyang11 小时前
【MySQL】环境变量配置
数据库·mysql·adb
无限大612 小时前
《AI观,观AI》:善用AI赋能|让AI成为你深耕核心、推进重心的“最强助手”
前端·后端
uzong12 小时前
CoPaw是什么?-- 2026年开源的国产个人AI助手
人工智能·后端
无心水12 小时前
【任务调度:框架】11、分布式任务调度进阶:高可用、幂等性、性能优化三板斧
人工智能·分布式·后端·性能优化·架构·2025博客之星·分布式调度框架
pjw1988090312 小时前
Spring Framework 中文官方文档
java·后端·spring
神仙别闹13 小时前
基于NodeJS+Vue+MySQL实现一个在线编程笔试平台
前端·vue.js·mysql
盒马盒马13 小时前
Rust:迭代器
开发语言·后端·rust
RDCJM13 小时前
【MySQL】在MySQL中STR_TO_DATE()以及其他用于日期和时间的转换
android·数据库·mysql
加成BUFF14 小时前
解决MySQL/MariaDB忘记root密码:完整重置教程(XAMPP/Windows版)
数据库·mysql·xampp
( •̀∀•́ )92014 小时前
Spring Boot 启动报错 `BindException: Permission denied`
java·spring boot·后端