二级索引 也叫辅助索引 、非聚簇索引,是建立在主键索引之外的索引。
假设有一张用户表:
CREATE TABLE users (
id BIGINT PRIMARY KEY,
name VARCHAR(50),
age INT
);
如果创建:
CREATE INDEX idx_name ON users(name);
那么 idx_name 就是二级索引。
二级索引存放什么
在 InnoDB 中,二级索引的叶子节点通常存放:
索引字段值 + 主键值
大致结构如下:
name = 'Tom' → id = 1001
name = 'Jack' → id = 1002
它通常不直接保存完整的一行数据。
查询过程
执行:
SELECT * FROM users
WHERE name = 'Tom';
查询过程是:
二级索引 idx_name
↓
找到 name = 'Tom' 对应的主键 id
↓
回到主键索引中查找完整数据
↓
得到整行记录
这个过程叫做回表。
二级索引的作用
1. 加快非主键字段查询
如果没有 idx_name,数据库可能需要扫描整张表:
逐行检查 name 是否等于 'Tom'
有二级索引后,可以快速定位符合条件的记录。
2. 支持排序和范围查询
例如:
SELECT * FROM users
WHERE age BETWEEN 20 AND 30
ORDER BY age;
建立:
CREATE INDEX idx_age ON users(age);
后,数据库可以利用索引快速定位范围,并按索引顺序扫描。
3. 加快关联查询
例如:
SELECT *
FROM orders
WHERE user_id = 1001;
给 orders.user_id 建立二级索引,可以提高根据用户查订单的效率,也有利于表连接操作。
4. 实现覆盖索引,避免回表
如果查询需要的字段都在二级索引中:
CREATE INDEX idx_name_age ON users(name, age);
SELECT name, age
FROM users
WHERE name = 'Tom';
二级索引中已经包含 name 和 age,数据库可以直接从索引返回结果,不需要再查询主键索引。这叫覆盖索引。
二级索引和主键索引的区别
| 对比项 | 主键索引 | 二级索引 |
|---|---|---|
| 一张表数量 | 通常只能有一个 | 可以有多个 |
| 是否要求唯一 | 必须唯一、不能为 NULL | 普通二级索引不要求 |
| 叶子节点 | 保存完整行数据 | 保存索引列和主键值 |
| 查询后是否可能回表 | 通常不需要 | 可能需要 |
| 主要用途 | 唯一标识和定位记录 | 加速其他字段的查询 |
一句话总结:
二级索引就是为非主键字段建立的 B+ 树目录,用来快速找到对应的主键,再通过主键索引获取完整记录。