聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)是索引设计的核心概念,二者的本质区别体现在 与数据物理存储的关联方式上,这种区别直接决定了它们的性能特性和适用场景。
我们平时说的 聚簇索引 和 非聚簇索引 ,其实就是 聚集索引 与 非聚集索引,同一个东西,只是叫法不一样。现在在比较新的文献、资料中,习惯叫聚集索引和非聚集索引。
聚集索引:索引即数据的 "物理排列"
1、聚集索引的核心是 索引键的排序顺序与数据在磁盘上的物理存储顺序完全一致。
2、可以类比为 按ISBN号来排序的图书馆书架 (ISBN,International Standard Book Number,国际标准书号),书在书架上的物理顺序就是ISBN顺序**(数据物理顺序=索引顺序)**,找书时直接按号码走到对应书架即可。
3、在数据库中,聚集索引的叶子节点直接存储完整的行数据 (而非指针)。也就是说,通过聚集索引找到叶子节点时,就能直接获取该行的所有字段值,无需额外查找。
4、由于数据的物理存储顺序只有一种,一张表只能有一个聚集索引 (这是最关键的限制),一般来说是 表的主键。
5、聚集索引的 B+树 示图:
非聚集索引:索引与数据 "独立排序"
1、非聚集索引的索引键排序与数据的物理存储顺序 毫无关联,二者是相互独立的结构。
2、可以类比为 图书馆入口处的电脑搜索 ,可以按 作者/书名/主题 等多种方式搜索。在电脑处搜索,每次搜索实际指向 书在书架的实际位置(包含指针) ,我们需要先在电脑处搜索,再根据搜索出的位置信息去书架找书**(二次查找)**。
3、在数据库中,非聚集索引的 叶子节点存储的是 "索引键值" 和 "指向数据物理位置的指针" 。通过非聚集索引查询时,需要先找到叶子节点的指针,再根据指针去磁盘读取完整数据(这个过程又称为 "书签查找" ,也就是我们经常说的 "回表")。
4、由于不影响数据的物理存储,一张表可以创建多个非聚集索引(但数量过多会增加存储和维护成本)。
5、非聚集索引的 B+树示图:
对比
对比维度 | 聚集索引 | 非聚集索引 |
---|---|---|
与数据存储的关系 | 决定数据的物理存储顺序(索引 = 数据顺序) | 与数据物理存储顺序无关(索引独立排序) |
数量限制 | 1 个(表的物理顺序唯一) | 多个(通常建议不超过 5-6 个,避免性能损耗) |
叶子节点内容 | 完整的行数据(包含所有字段) | 索引键值 + 指针(指向数据位置或聚集索引键) |
查询性能(全量数据) | 极高(直接定位数据,无二次查找) | 相对聚集低一些(需先查索引,再通过指针找数据) |
范围查询效率 | 最优(数据连续存储,可批量读取) | 相对聚集差一些(需多次书签查找,数据分散) |
对写入的影响 | 插入 / 更新成本高(可能导致数据物理移动) | 插入 / 更新成本较低(仅需维护索引结构) |
总结
- 聚集索引是 "数据的物理排列方式" ,索引与数据绑定,全表只能有一个,磁盘IO效率 - "连续IO"。
- 非聚集索引是 "数据的目录" ,索引与数据独立,全表可以有多个,磁盘IO效率 - "随机IO"。
别让过分苛求,阻碍了我们通往优秀的路,更不要因为追求完美,给自己施加太大压力,而不去行动。-- 烟沙九洲