[MySQL面试题]-索引 23-27 什么是回表操作?

79 阅读2分钟

image.png

23 什么是回表操作?

非聚簇索引查到 主键id,再去聚簇索引查找完整的数据

回表操作(Back to Table)是mysql 中 innodb 引擎特有的一种查询过程。当使用 secondary index 查询时,无法直接获取整行数据,于是 mysql 会先根据 secondary index 获取到对应的 主键值 primary key, 再去 聚簇索引(主键索引)中查找整行数据。

CREATE TABLE user (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    INDEX idx_email(email)
);

SELECT name FROM user WHERE email = 'abc@example.com';
  1. 使用 idx_email 非聚簇索引,快速定位 email = ‘xxx’ 对应的主键值 id。
  2. 拿到 id 后,再到聚簇索引(主键B+树) 中查找整行记录
  3. 取出 name 字段并返回。

24 什么是覆盖索引?

需要查询的列在索引上。

CREATE TABLE user (
  id BIGINT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100),
  age INT,
  INDEX idx_age (age),
  INDEX idx_email_name (email, name)
);

-- 不需要回表

select age from user where age > 18;

select name from user where email = 'abc@example.com';

25 非聚集索引一定回表查询吗?

不,非聚簇索引(Secondary Index) 并不一定总是需要回表查询。

是否发生回表,关键取决于当前 SQL 查询是否是 覆盖索引查询(Covering Index)


26 为什么要回表查询?为什么非聚簇索引不直接存储全部数据?

回表查询是为了节省存储空间与提高索引性能

索引不是用来存储全部数据的,而是用来加速查找的。

  1. 索引页空间宝贵,存储整行数据浪费严重。
  2. 冗余数据难以维护,更新开销巨大。
  3. 回表结构更灵活,便于扩展与兼容。
  4. 支持多版本并发控制(MVCC)

27 InnoDB 表删除主键后是否还能回表?

可以回表,InnoDB 会自动创建一个“隐藏主键” 来维护聚簇索引结构

如果没有显式主键,InnoDB 的处理方式

优先级条件说明聚簇索引的主键来源
1存在 primary key使用主键
2存在 unique not null 的列使用第一个符合条件的列
3都没有时自动生成一个6字节的隐藏 row_id