聚集索引和非聚集索引有什么区别?


277

a clustered和a有non-clustered index什么区别?


8
每个表只能有一个聚集索引。但是还有很多其他的区别……
汤姆·罗宾逊

5
聚集索引实际上描述了记录在磁盘上的物理存储顺序,因此,您只能拥有一个的原因。非聚集索引定义的逻辑顺序与磁盘上的物理顺序不匹配。
乔什

1
基本上,群集意味着表中的数据按该物理顺序排列。这就是为什么每个表只能有一个的原因。未聚集表示它“仅”是逻辑顺序。
比里

2
@biri什么是“逻辑”命令?非聚集索引按物理顺序存储索引键,并且存储指向表的指针,即聚集索引键。
斯蒂芬妮·佩奇

@Stephanie Page:从表的角度看是合乎逻辑的。当然,非聚集索引在索引本身中是物理排序的。
比里(Biri)2013年

Answers:


268

聚集索引

  • 每桌一张
  • 比非集群更快地读取数据,因为数据以索引顺序进行物理存储

非聚集索引

  • 每张桌子可使用多次
  • 插入和更新操作比聚集索引更快

当选择具有使用索引的字段的数据时,两种类型的索引都将提高性能,但是会减慢更新和插入操作的速度。

由于插入和更新的速度较慢,因此应在通常为增量的字段(即Id或Timestamp)上设置聚集索引。

如果SQL Server的选择性高于95%,则通常只使用索引。


9
还有一些存储注意事项。当将行插入没有聚集索引的表中时,这些行会在页面上背对背存储,更新行可能会导致该行移动到表的末尾,从而留出空白空间并使表和索引碎片化。
耶利米·佩斯卡

4
您不必关心x是什么。您需要知道的是,对于拥有数百万用户的应用程序,x将会很重要
Pacerier's

14
这纯粹是教条。它不是“读取更快,因为数据是按顺序存储的”。读取速度更快,因为可以避免索引读取,然后再读取表。范围扫描速度更快(如果有意义的话),因为数据是按顺序存储的。即聚类因子是完美的。
Stephanie Page

6
同样,认为95%的记录需要唯一的想法也是谬论。假设您有一个包含1,000,000行的表,并为一个包含500,000键的列建立索引。0%是唯一的,但每个键返回一百万行中的2行。无论0%的记录是唯一的,此索引都是绝对有用的。
Stephanie Page

2
“数据按索引顺序物理存储”是什么意思?一方面,这是正确的,因为数据页面和索引叶页面是相同的,因此很显然,一个页面的顺序描述了另一个页面的顺序。但是,这不一定按任何特定的顺序进行,例如索引键stackoverflow.com/questions/1251636/…的
Martin Smith,

79

聚集索引对磁盘上的数据进行物理排序。这意味着索引不需要额外的数据,但是(显然)只能有一个聚集索引。使用聚簇索引访问数据最快。

所有其他索引都必须是非聚集的。非聚集索引具有索引列中数据的重复副本,这些数据保持有序排列,并带有指向实际数据行的指针(指向聚集索引的指针,如果有的话)。这意味着通过非聚集索引访问数据必须经过一个间接层。但是,如果只选择索引列中可用的数据,则可以直接从重复的索引数据中获取数据(这就是为什么只选择需要的列而不使用*的一个好主意)


3
“但是,如果仅选择索引列中可用的数据,则可以直接从重复的索引数据中获取数据”-是的,这是首选的聚集索引启发式的重要例外。我猜在这种情况下,您实际上具有聚集索引,但是查询的表中的数据较少,因此可能可以更快地从磁盘读取数据。
satnhak 2012年

34

聚簇索引物理上存储在表上。这意味着它们是最快的,并且每个表只能有一个聚集索引。

非聚集索引是分开存储的,可以有任意多个。

最好的选择是在最常用的唯一列(通常是PK)上设置聚簇索引。您的表中应该始终有一个精选的聚集索引,除非一个非常有说服力的原因–不能想到一个,但是,嘿,它可能在那里–因为不这样做。


3
您能否详细说明“我们的表中应始终有聚簇索引”?不加说明,由于“ 永远
Pacerier

1
您是对的Pacerier,不要轻易使用绝对语句。尽管我不知道何时不应该有一个精心挑选的聚集索引,但是这种情况可能存在,因此我将答案改为了更通用的版本。
圣地亚哥·塞帕斯

28

聚集索引

  1. 一个表只能有一个聚集索引。
  2. 通常在主键上进行。
  3. 聚集索引的叶节点包含数据页。

非聚集索引

  1. 一个表只能有249个非聚集索引(直到sql 2005以后的版本最多支持999个非聚集索引)。
  2. 通常按任意键制成。
  3. 非聚集索引的叶节点不包含数据页。相反,叶节点包含索引行。

24

聚集索引

  • 一个表中只能有一个聚集索引
  • 排序记录并根据顺序将其物理存储
  • 数据检索比非聚簇索引快
  • 不需要额外的空间来存储逻辑结构

非聚集索引

  • 一个表中可以有任意数量的非聚集索引
  • 不影响身体秩序。为数据行创建逻辑顺序,并使用指向物理数据文件的指针
  • 数据插入/更新比聚集索引快
  • 使用额外的空间来存储逻辑结构

除了这些差异之外,您还必须知道,当非聚集表时(当表没有聚簇索引时)数据文件是无序的,并且使用堆数据结构作为数据结构。


10

基本上,群集意味着数据按表中的物理顺序排列。这就是为什么每个表只能有一个的原因。

未聚集表示它“仅”是逻辑顺序。


9

优点:

聚集索引非常适合范围(例如,从my_table中选择*,其中my_key在@min和@max之间)

在某些情况下,如果您使用orderby语句,则DBMS不必进行排序。

缺点:

聚簇索引会降低插入速度,因为如果新键的顺序不正确,则在插入记录时必须修改记录的物理布局。


6

聚集索引本质上是索引列中数据的排序副本。

聚集索引的主要优点是,当您的查询(搜索)在索引中找到数据时,则不需要其他IO来检索该数据。

维护聚簇索引(尤其是在频繁更新的表中)的开销可能导致性能下降,因此,创建非聚簇索引可能更可取。


6

索引数据库分为两部分:一组物理记录,以任意顺序排列;一组索引,标识应读取记录的顺序以产生按某种标准排序的结果。如果物理排列和索引之间没有相关性,那么按顺序读出所有记录可能需要进行许多独立的单记录读取操作。因为与读取两个非连续记录相比,数据库可以在更少的时间内读取数十个连续记录,所以如果索引中连续的记录也连续存储在磁盘上,则可以提高性能。

例如,如果要从一个空的非集群数据库开始并以随机顺序添加10,000条记录,则记录可能会按照添加顺序的末尾添加。按索引顺序读出数据库将需要10,000次单记录读取。但是,如果要使用群集数据库,则系统可能会在添加每条记录时检查以前的记录是否由其自身存储;如果发现确实如此,则可以在数据库末尾用新记录写该记录。然后,它可以查看移动记录以前所在的插槽之前的物理记录,并查看其后的记录是否由自身存储。如果发现确实如此,则可以将该记录移至该位置。使用这种方法会导致许多记录成对分组,

实际上,集群数据库使用的算法要比这复杂得多。但是要注意的关键是,在更新数据库所需的时间与顺序读取数据库所需的时间之间需要权衡。维护集群数据库将显着增加以任何可能影响排序顺序的方式添加,删除或更新记录所需的工作量。如果顺序读取数据库的频率比更新顺序读取的频率高,那么集群将是一个大赢家。如果将经常对其进行更新但很少按顺序进行读取,则聚类可能会浪费大量的性能,尤其是如果将项目添加到数据库的顺序与聚簇索引的排序顺序无关。


5

聚集索引实际上描述了记录在磁盘上的物理存储顺序,因此,您只能拥有一个的原因。

非聚集索引定义的逻辑顺序与磁盘上的物理顺序不匹配。


2

您可能已经阅读了以上文章中的理论部分:

-如我们所见,聚集索引直接指向要记录的点,即它的直接索引,因此搜索所需的时间更少。此外,将不需要任何额外的内存/空间来存储索引

-虽然在非聚集索引中,它间接指向聚集索引,然后它将访问实际记录,由于其间接性质,将需要花费更多的时间来访问它,而且它需要自己的内存/空间来存储指数

在此处输入图片说明


0

//从MSDN复制,非聚集索引的第二点未在其他答案中明确提及。

聚类

  • 聚集索引根据它们的键值对数据行进行排序并将其存储在表或视图中。这些是索引定义中包括的列。每个表只能有一个聚集索引,因为数据行本身只能以一种顺序存储。
  • 表中的数据行唯一按排序顺序存储的时间是表包含聚簇索引时。当表具有聚簇索引时,该表称为聚簇表。如果表没有聚集索引,则其数据行存储在称为堆的无序结构中。

非集群

  • 非聚集索引的结构与数据行分开。非聚集索引包含非聚集索引键值,并且
    每个键值条目都有一个指向包含键值的数据行的指针。
  • 从非聚集索引中的索引行到数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是在群集表中。对于堆,行定位器是指向该行的指针。对于聚簇表,行定位符是聚簇索引键。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.