Page 1 of 1

什么是聚集索引和非聚集索引?

Posted: Mon May 19, 2025 7:19 am
by muskanislam99
聚集索引是一种特殊的索引类型,它决定了表中数据行的物理存储顺序。你可以将聚集索引视为书籍本身按照某种特定的顺序(例如,按页码)排列。由于数据行只能以一种物理顺序存储,因此每个表只能有一个聚集索引。

关键特性:

物理排序: 聚集索引直接影响数据在磁盘上的物理排列方式。当一个表拥有聚集索引时,数据行会按照索引键的值进行排序并存储。
叶节点是数据页: 聚集索引的叶节点包含了实际的数据行,而不是指向数据行的指针。因此,通过聚集索引可以直接找到所需的数据。
每个表只有一个: 由于数据只能以一种物理顺序存储,所以一个表只能拥有一个聚集索引。
通常基于主键: 在许多数据库系统中,当你为一个表定义主键约束时,系统会自动创建一个聚集索引(如果该表还没有聚集索引)。这使得基于主键的查询非常高效。
如果表没有聚集索引 (Heap): 如果一个表没有聚集索引,它的数据行将以堆 (heap) 的形式存储,即数据行以任意顺序存储,没有特定的物理排序。
工作原理:

当查询涉及到聚集索引的列时,数据库系统会直接遍历聚集索引的 B-tree 结构,最终在叶节点找到排序后的数据行。由于数据是物理排序的,范围查询(例如,查找某个日期范围内的记录)和排序操作在聚集索引上通常非常高效,因为相关的数据行在磁盘上是连续存储的。

非聚集索引 (Non-Clustered Index)

非聚集索引是一种与表中数据的物理存储顺序分开的 日本赌博数据 索引结构。你可以将非聚集索引视为书籍末尾的普通索引,它包含了关键词以及关键词对应内容所在的页码。非聚集索引存储了索引键值以及一个指向实际数据行的指针 (row locator)。

关键特性:

逻辑排序: 非聚集索引创建了一个逻辑上的排序结构,但并不影响数据在磁盘上的物理存储顺序。
叶节点是指针: 非聚集索引的叶节点包含了索引键值以及一个指向包含该键值的数据行的指针。这个指针可以是数据行的物理地址(在堆表中),也可以是聚集索引的键值(在拥有聚集索引的表中)。
每个表可以有多个: 一个表可以拥有多个非聚集索引,每个索引可以基于不同的列或列组合。
需要额外的查找: 当查询通过非聚集索引找到匹配的索引行后,通常需要根据指针(行定位器)到实际的数据页去检索完整的行数据。这个额外的查找操作称为书签查找 (bookmark lookup) 或键查找 (key lookup),在某些情况下可能会带来额外的性能开销。
覆盖索引: 一种特殊的非聚集索引是覆盖索引 (covering index)。如果一个非聚集索引包含了查询所需的所有列(包括 SELECT 列表中的列和 WHERE 子句中的列),那么数据库可以直接从索引中获取所有数据,而无需回表查找,从而显著提高查询性能。
工作原理:

当查询使用非聚集索引的列时,数据库系统会搜索非聚集索引的 B-tree 结构,找到匹配的索引键值,然后通过叶节点中的指针定位到实际的数据行。

聚集索引 vs. 非聚集索引:

特性 聚集索引 (Clustered Index) 非聚集索引 (Non-Clustered Index)
物理排序 决定数据的物理存储顺序 不影响数据的物理存储顺序
叶节点内容 实际的数据行 索引键值 + 指向数据行的指针 (行定位器或聚集索引键)
每个表的数量 最多一个 可以有多个
查找速度 通常更快,特别是范围查询和排序 需要额外的书签查找(如果索引不覆盖查询)
存储空间 索引和数据存储在一起,不额外占用存储(排序会影响存储) 额外占用存储空间
维护成本 插入和更新可能涉及数据的物理移动,成本较高 相对较低
用途 主键列、经常用于范围查询和排序的列 经常用于 WHERE 子句但非聚集索引的列、覆盖查询

Export to Sheets
总结:

理解聚集索引和非聚集索引的区别对于设计高效的数据库 Schema 和优化查询至关重要。合理地选择创建哪种类型的索引,以及在哪些列上创建索引,可以显著提升数据库的性能。通常,每个表都应该有一个聚集索引(通常是主键),而可以根据查询需求创建多个非聚集索引来加速特定的查询操作。同时需要权衡索引带来的查询性能提升和维护成本之间的关系。