MySQL 中的回表是什么?
回表(Back to Table) 指的是 查询使用了非聚簇索引(普通索引)时,先在索引树中找到主键值,再回到聚簇索引查找完整数据的过程。
1️⃣ 为什么会发生回表?
在 InnoDB 存储引擎中:
- 聚簇索引(Clustered Index) 的叶子节点直接存储完整的行数据,因此查询主键时不需要回表。
- 非聚簇索引(Secondary Index) 叶子节点存储的是 主键值,查询时如果需要完整数据,就必须通过主键值再去 聚簇索引 查找,导致回表。
2️⃣ 如何优化回表?
- 使用覆盖索引,避免回表。
- 减少查询的字段数量,尽量让查询字段都在索引里。
- 主键查询优于普通索引查询
3️⃣ 总结
查询方式 | 是否回表 | 原因 |
---|---|---|
主键查询 (id ) | ❌ 不需要 | 聚簇索引直接存储完整行数据 |
非聚簇索引查询 (name ) | ✅ 需要 | 先通过 name 索引找到主键,再回表查完整数据 |
覆盖索引查询 (name, age ) | ❌ 不需要 | 查询的字段都在索引中,避免回表 |