聚集索引和非聚集索引之间的区别
聚簇索引与非聚簇索引的关键区别
- 聚簇索引是一种索引,它根据键值对表中的数据行进行排序,而非聚簇索引将数据存储在一个位置,而索引存储在另一个位置。
- 聚簇索引在索引的叶节点中存储数据页,而非聚簇索引方法从不将数据页存储在索引的叶节点中。
- 聚簇索引不需要额外的磁盘空间,而非聚簇索引需要额外的磁盘空间。
- 聚簇索引提供更快速的数据访问,而另一方面,非聚簇索引速度较慢。

什么是索引?
索引是数据库中基于一列或多列创建的键,可以加快从表或视图中检索行的速度。此键有助于 Oracle、SQL Server、MySQL 等数据库快速查找与键值关联的行。
有两种类型的索引:
- 聚簇索引
- 非聚簇索引
什么是聚簇索引?
聚簇索引是一种根据键值对表中的数据行进行排序的索引。在数据库中,每个表只有一个聚簇索引。
聚簇索引定义了表中数据的存储顺序,该顺序只能按一种方式排序。因此,每个表只能有一个聚簇索引。在 RDBMS 中,通常主键允许您基于该特定列创建聚簇索引。
什么是堆栈索引?
非聚簇索引将数据存储在一个位置,而索引存储在另一个位置。索引包含指向该数据位置的指针。一个表可以有许多非聚簇索引,因为非聚簇索引中的索引存储在不同的位置。
例如,一本书可以有多个索引,一个在开头,按单元显示书的内容,而第二个索引按字母顺序列出术语的索引。
非聚簇索引在表的非排序字段中定义。这种索引方法有助于提高使用非主键的查询的性能。非聚簇索引允许您为主表添加唯一键。
聚簇索引的特征
- 默认和排序的数据存储
- 为索引使用一列或多列
- 帮助您将数据和索引存储在一起
- 碎片整理
- 操作
- 聚簇索引扫描和索引查找
- 键查找
非聚簇索引的特征
- 仅存储键值
- 指向堆/聚簇索引行的指针
- 允许二级数据访问
- 数据桥梁
- 索引扫描和索引查找操作
- 您可以为表或视图创建非聚簇索引
- 非聚簇索引中的每个索引行都存储非聚簇键值和一个行定位符
SQL 中的聚簇索引与非聚簇索引:关键区别
参数 | 聚簇 | 非聚簇 |
---|---|---|
用途 | 您可以对记录进行排序,并将聚簇索引物理地存储在内存中,以匹配顺序。 | 非聚簇索引可以帮助您为数据行创建逻辑顺序,并使用指针指向物理数据文件。 |
存储方法 | 允许您将数据页存储在索引的叶节点中。 | 这种索引方法从不将数据页存储在索引的叶节点中。 |
大小 | 聚簇索引的大小相当大。 | 与聚簇索引相比,非聚簇索引的大小较小。 |
数据访问 | 更快 | 与聚簇索引相比速度较慢 |
额外的磁盘空间 | 不需要 | 需要单独存储索引 |
键类型 | 默认情况下,表的主键是聚簇索引。 | 它可以与表上的唯一约束一起使用,充当复合键。 |
主要特点 | 聚簇索引可以提高数据检索的性能。 | 应在用作连接的列上创建。 |
聚簇索引的示例
在下面的示例中,SalesOrderDetailID 是聚簇索引。检索数据的示例查询
SELECT CarrierTrackingNumber, UnitPrice FROM SalesData WHERE SalesOrderDetailID = 6
非聚簇索引的示例
在下面的示例中,在 OrderQty 和 ProductID 上创建了一个非聚簇索引,如下所示
CREATE INDEX myIndex ON SalesData (ProductID, OrderQty)
与聚簇索引相比,以下查询将检索得更快。
SELECT Product ID, OrderQty FROM SalesData WHERE ProductID = 714
聚簇索引的优点
聚簇索引的优点/好处是:
- 聚簇索引是范围查询或 GROUP BY(带 MAX、MIN、COUNT 等类型)查询的理想选择
- 在这种索引中,搜索可以直接定位到数据的特定点,然后您可以从那里开始顺序读取。
- 聚簇索引方法使用位置机制来定位范围开头的索引条目。
- 当请求范围内的搜索键值时,这是一种有效的范围搜索方法。
- 有助于最小化页面传输并最大化缓存命中。
非聚簇索引的优点
使用非聚簇索引的优点是:
- 非聚簇索引可以帮助您快速从数据库表中检索数据。
- 有助于避免与聚簇索引相关的开销
- 表可能在 RDBMS 中有多个非聚簇索引。因此,它可用于创建多个索引。
聚簇索引的缺点
以下是使用聚簇索引的缺点/劣势:
- 大量按非顺序插入
- 聚簇索引会产生大量连续的页面拆分,包括数据页和索引页。
- SQL 的插入、更新和删除需要额外工作。
- 当聚簇索引中的字段发生更改时,聚簇索引更新记录所需的时间更长。
- 聚簇索引的叶节点大多包含数据页。
非聚簇索引的缺点
以下是使用非聚簇索引的缺点/劣势:
- 非聚簇索引有助于按逻辑顺序存储数据,但不允许物理排序数据行。
- 非聚簇索引的查找过程成本很高。
- 每次群集键更新时,都需要在非群集索引上进行相应的更新,因为它存储了群集键。