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';
- 使用 idx_email 非聚簇索引,快速定位 email = ‘xxx’ 对应的主键值 id。
- 拿到 id 后,再到聚簇索引(主键B+树) 中查找整行记录
- 取出 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 为什么要回表查询?为什么非聚簇索引不直接存储全部数据?
回表查询是为了节省存储空间与提高索引性能
索引不是用来存储全部数据的,而是用来加速查找的。
- 索引页空间宝贵,存储整行数据浪费严重。
- 冗余数据难以维护,更新开销巨大。
- 回表结构更灵活,便于扩展与兼容。
- 支持多版本并发控制(MVCC)
27 InnoDB 表删除主键后是否还能回表?
可以回表,InnoDB 会自动创建一个“隐藏主键” 来维护聚簇索引结构
如果没有显式主键,InnoDB 的处理方式
| 优先级 | 条件说明 | 聚簇索引的主键来源 |
|---|---|---|
| 1 | 存在 primary key | 使用主键 |
| 2 | 存在 unique not null 的列 | 使用第一个符合条件的列 |
| 3 | 都没有时 | 自动生成一个6字节的隐藏 row_id |