找回密码
 立即注册
首页 业界区 业界 聚集索引与非聚集索引的区别

聚集索引与非聚集索引的区别

摹熹 昨天 19:59
聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)是索引设计的核心概念,二者的本质区别体现在 与数据物理存储的关联方式 上,这种区别直接决定了它们的性能特性和适用场景。
我们平时说的 聚簇索引非聚簇索引,其实就是 聚集索引非聚集索引,同一个东西,只是叫法不一样。现在在比较新的文献、资料中,习惯叫聚集索引和非聚集索引。
聚集索引:索引即数据的 "物理排列"

1、聚集索引的核心是 索引键的排序顺序与数据在磁盘上的物理存储顺序完全一致
2、可以类比为 按ISBN号来排序的图书馆书架(ISBN,International Standard Book Number,国际标准书号),书在书架上的物理顺序就是ISBN顺序(数据物理顺序=索引顺序),找书时直接按号码走到对应书架即可。
3、在数据库中,聚集索引的 叶子节点直接存储完整的行数据(而非指针)。也就是说,通过聚集索引找到叶子节点时,就能直接获取该行的所有字段值,无需额外查找
4、由于数据的物理存储顺序只有一种,一张表只能有一个聚集索引(这是最关键的限制),一般来说是 表的主键
5、聚集索引的 B+树 示图:
1.png

非聚集索引:索引与数据 "独立排序"

1、非聚集索引的索引键排序与数据的物理存储顺序 毫无关联,二者是相互独立的结构。
2、可以类比为 图书馆入口处的电脑搜索,可以按 作者/书名/主题 等多种方式搜索。在电脑处搜索,每次搜索实际指向 书在书架的实际位置(包含指针),我们需要先在电脑处搜索,再根据搜索出的位置信息去书架找书(二次查找)
3、在数据库中,非聚集索引的 叶子节点存储的是 "索引键值" 和 "指向数据物理位置的指针"。通过非聚集索引查询时,需要先找到叶子节点的指针,再根据指针去磁盘读取完整数据(这个过程又称为 "书签查找",也就是我们经常说的 "回表")。
4、由于不影响数据的物理存储,一张表可以创建多个非聚集索引(但数量过多会增加存储和维护成本)。
5、非聚集索引的 B+树 示图:
2.png

对比

对比维度聚集索引非聚集索引与数据存储的关系决定数据的物理存储顺序(索引 = 数据顺序)与数据物理存储顺序无关(索引独立排序)数量限制1 个(表的物理顺序唯一)多个(通常建议不超过 5-6 个,避免性能损耗)叶子节点内容完整的行数据(包含所有字段)索引键值 + 指针(指向数据位置或聚集索引键)查询性能(全量数据)极高(直接定位数据,无二次查找)相对聚集低一些(需先查索引,再通过指针找数据)范围查询效率最优(数据连续存储,可批量读取)相对聚集差一些(需多次书签查找,数据分散)对写入的影响插入 / 更新成本高(可能导致数据物理移动)插入 / 更新成本较低(仅需维护索引结构)总结


  • 聚集索引是 "数据的物理排列方式",索引与数据绑定,全表只能有一个,磁盘IO效率 - "连续IO"
  • 非聚集索引是 "数据的目录",索引与数据独立,全表可以有多个,磁盘IO效率 - "随机IO"
别让过分苛求,阻碍了我们通往优秀的路,更不要因为追求完美,给自己施加太大压力,而不去行动。-- 烟沙九洲

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册