IT评测·应用市场-qidao123.com

标题: 3-001:MySQL 中的回表是什么? [打印本页]

作者: 祗疼妳一个    时间: 2025-3-13 05:44
标题: 3-001:MySQL 中的回表是什么?
1. 什么是回表?

回表(Back to Table) 指的是 在使用非聚簇索引(辅助索引)查询时,MySQL 必要 先通过索引找到主键 ID,然后再回到主键索引(聚簇索引)查询完整数据,这一过程称为回表。

2. 回表的示例

假设有一张 users 表:
  1. CREATE TABLE users (
  2.     id INT PRIMARY KEY,       -- 主键
  3.     name VARCHAR(50),         -- 用户名
  4.     age INT,                  -- 年龄
  5.     address VARCHAR(255),      -- 地址
  6.     INDEX idx_name (name)      -- 创建 name 的辅助索引
  7. ) ENGINE=InnoDB;
复制代码
如果实行以下查询:
  1. SELECT address FROM users WHERE name = 'Alice';
复制代码
查询实行过程:
   为什么要回表? 由于 idx_name 只存了 name 和 id,但 address 不在索引中,必须再回到主键索引查找完整数据。
  
3. 什么情况下会发生回表?



4. 怎样避免回表?

(1)使用覆盖索引

如果查询的字段已经包含在索引中,就可以避免回表
  1. CREATE INDEX idx_name_age ON users(name, address);
复制代码
然后实行:
  1. SELECT address FROM users WHERE name = 'Alice';
复制代码
此时,idx_name_age 索引已经包含 name 和 address,以是可以直接在索引中获取数据,不必要回表
(2)使用主键查询

如果使用 id(主键)查询,就不必要回表:
  1. SELECT address FROM users WHERE id = 3;
复制代码
由于 InnoDB 的主键索引(聚簇索引)本身就存储了完整数据,以是查询 id 不会回表。

5. 总结

查询方式是否回表缘故原由主键查询 (SELECT * FROM users WHERE id = 3)不会由于主键索引(聚簇索引)包含完整数据非主键索引查询 (SELECT address FROM users WHERE name = ‘Alice’)会回表先查 name 索引,再回表查 address覆盖索引查询 (SELECT name FROM users WHERE name = ‘Alice’)不会name 索引已经包含查询字段   




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4