全栈开发
数据库
【Q381】什么是覆盖索引

什么是覆盖索引

Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 386 (opens in a new tab)

Author 回答者: shfshanyue (opens in a new tab)

假设一个用户表 User(id primary, name unique, age),此时 name 为唯一索引。

聚合索引: select * from User where id in (1, 2, 3, 4, 5),由于 id 都在 B+ tree 的叶子节点,不需要去磁盘进一步 IO,称作聚合索引

假设有一个需求: 根据 name 查询该人对应的 age,在现有情况下是这样的:

  1. 根据 name 上的 B+ tree 快速找到该行对应的 id
  2. 根据 id 上的 B+ tree 快速找到该行对应的 age,此时需要通过主键 id 进一步 IO,称作回表

如果建立一个联合索引 (name, age),直接在 name 上的 B+ tree 就可以找到它对应的 age,省了回表操作,称为覆盖索引