一、什么是聚集索引(Clustered Index)
聚集索引是一种 数据存储方式,它将 索引和数据放在同一个 B+ 树结构中。
- 一个表最多只能有一个聚集索引。
- 聚集索引的叶子节点就是数据行本身。
- 表的数据是按照聚集索引的顺序进行物理存储的。
二、什么是非聚集索引(Secondary Index / Non-Clustered Index)
非聚集索引是指 索引结构与数据分离,索引的叶子节点存储的是指向真实数据的“指针”或“主键值”。
- 一个表可以有多个非聚集索引。
- 查询非聚集索引字段时,需要通过主键回表查询实际数据(称为“回表”)。
三、对比总结
| 特性 | 聚集索引 | 非聚集索引 |
|---|---|---|
| 结构 | 索引和数据在同一棵 B+ 树中 | 索引与数据分离,叶子节点存储主键值 |
| 数据访问 | 直接从索引中获取数据,无需回表 | 需要根据主键回表获取数据 |
| 数量限制 | 每个表只能有一个 | 一个表可以有多个 |
| 适用场景 | 范围查询、高频排序、高频主键查询 | 精确查询、非主键字段索引查询 |
InnoDB 与 MyISAM 索引类型对比
| 引擎 | 聚集索引 | 非聚集索引 |
|---|---|---|
| InnoDB | 默认使用聚集索引(主键) | 支持非聚集索引 |
| MyISAM | 不支持聚集索引 | 所有索引都是非聚集索引 |
InnoDB 特点
- 使用主键作为聚集索引(没有主键则选择第一个唯一非空索引,否则隐式生成 rowid)。
- 二级索引的叶子节点存储的是主键值(回表查询依赖聚集索引)。
- 事务支持强,支持行级锁。
MyISAM 特点
- 所有索引的叶子节点都指向数据文件的物理地址。
- 不支持聚集索引,也不支持事务和行级锁。
面试总结
在面试中可以这样说:
在 InnoDB 中,主键是聚集索引,数据存储在聚集索引的叶子节点中;而二级索引是非聚集索引,存储的是主键值,所以查询非主键字段时需要“回表”。而 MyISAM 不支持聚集索引,所有索引都是非聚集索引,叶子节点直接存储数据地址。InnoDB 适合高并发事务场景,MyISAM 更适合读多写少的查询场景。
联合索引(组合索引)与最左前缀原则
一、联合索引(组合索引)
联合索引是指对多个字段建立的一个索引,本质是一个多列的 B+ 树索引。例如:
CREATE INDEX idx_name_age ON user(name, age);
二、最左前缀原则(Leftmost Prefix Rule)
最左前缀原则指:在使用联合索引时,查询条件必须包含联合索引中最左边的一列或连续前缀列,索引才会生效。
例如,有一个联合索引:
CREATE INDEX idx_a_b_c ON table(a, b, c);
下列查询中,索引的使用情况如下:
WHERE a = 1
✅ 命中索引,符合最左前缀。WHERE a = 1 AND b = 2
✅ 命中索引,连续使用了前缀列。WHERE a = 1 AND c = 3
✅ 仅a使用索引,c无法利用索引。WHERE b = 2
❌ 不命中索引,跳过了最左列a。WHERE a > 10 AND b = 3
✅a为范围查询,b无法再使用索引。
总结:
联合索引按顺序建立,查询时必须遵循“最左前缀”原则。
只有从最左边开始连续使用字段,索引才能被正确利用。