mysql 什么是回表
回首青春,我发现自己失去了很多宝贵的东西。但我并不难过,因为我知道,以后会失去的更多。
定义
回表(Return to Table / Bookmark Lookup),是 MySQL InnoDB 引擎在执行查询时的一种特定操作。简单来说,它指的是:MySQL 先通过辅助索引(二级索引)找到数据的主键(ID),然后再拿着这个主键到主键索引(聚簇索引)中,去获取整行完整数据的过程。
1、为什么会发生索引
要理解回表,必须先理解 InnoDB 的两种索引结构:
- 主键索引(聚簇索引,Clustered Index):叶子节点上直接存储了整行数据。找到了主键,就找到了这一行的所有列。
- 辅助索引(二级索引,Secondary Index):叶子节点上只存储了索引列的值 + 对应行的主键值(不存储整行数据)
矛盾点:如果你的查询条件用的是辅助索引(比如 name 字段),但这个 name 索引里并没有存放 age 或 address 等数据。为了拿到 SELECT * 或查询条件之外的其他列,数据库就必须拿着找到的 id,再去主键索引里捞一遍数据。这个“再捞一遍”的动作,就是回表。
2、一次完整的“回表”查询流程:
假设有一张用户表 user:
CREATE TABLE user (
id INT PRIMARY KEY, -- 主键索引
name VARCHAR(20), -- 辅助索引
age INT,
INDEX idx_name (name) -- 在 name 上建立普通索引
);
执行一条SQL语句:
SELECT * FROM user WHERE name = '张三';
层执行步骤(三步走):
- 走辅助索引:在 idx_name 这棵 B+ 树上,找到 name='张三' 的叶子节点。
-
获取主键:从该叶子节点中读出对应的主键 ID(假设为 id = 10)。
- 表查询:拿着 id=10,去主键索引(聚簇索引)的 B+ 树上再次检索,找到 id=10 对应的叶子节点,从中读出 id, name, age 这整行完整数据,返回给客户端。
第 3 步,就是“回表”。
基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

浙公网安备 33010602011771号