clustered
和non-clustered index
有什么区别?
索引数据库有两部分:一组物理记录,按任意顺序排列;一组索引,用于标识应读取记录的顺序,以产生按某种标准排序的结果。如果物理排列和索引之间没有相关性,那么按顺序读出所有记录可能需要进行大量独立的单记录读取操作。因为数据库可以在比读取两个非连续记录所花费的时间更短的时间内读取数十个连续记录,所以如果索引中连续的记录也连续存储在磁盘上,则可以提高性能。指定索引是群集的将导致数据库做出一些努力(不同的数据库有多少不同)来安排事情,以便索引中连续的记录组在磁盘上是连续的。
例如,如果要以空的非群集数据库开始并按随机顺序添加10,000条记录,则记录可能会按添加顺序添加到最后。按索引按顺序读出数据库需要10,000个单记录读取。但是,如果要使用群集数据库,系统可能会检查添加每条记录的时间是否自己存储了以前的记录;如果发现是这种情况,它可能会在数据库末尾用新的记录写下该记录。然后,它可以在移动的记录用于驻留的插槽之前查看物理记录,并查看随后的记录是否由其自身存储。如果发现是这种情况,它可以将该记录移动到该位置。使用这种方法会导致许多记录成对分组,因此可能几乎使顺序读取速度加倍。
实际上,群集数据库使用比这更复杂的算法。但需要注意的一点是,在更新数据库所需的时间与按顺序读取数据库所需的时间之间存在权衡。维护群集数据库将显着增加以任何可能影响排序顺序的方式添加,删除或更新记录所需的工作量。如果按顺序读取数据库的次数比更新次数要多,则群集可能是一个很大的胜利。如果它经常更新但很少按顺序读出,则群集可能是一个很大的性能消耗,特别是如果项目添加到数据库的顺序与它们关于聚簇索引的排序顺序无关。
//从MSDN复制,其他答案中没有明确提到非聚集索引的第二点。
集群
非聚集
聚簇索引物理存储在表中。这意味着它们是最快的,每个表只能有一个聚簇索引。
非聚集索引是单独存储的,您可以拥有任意数量的索引。
最好的选择是在最常用的唯一列上设置聚簇索引,通常是PK。你应该总是在你的表中有一个精心挑选的聚集索引,除非有一个非常令人信服的理由 - 不能想到一个,但是嘿,它可能在那里 - 因为没有这样做。
除了这些差异之外,您还必须知道当表是非群集的时(当表没有聚簇索引时),数据文件是无序的,并且它使用堆数据结构作为数据结构。
群集基本上意味着数据处于表中的物理顺序。这就是为什么每桌只能有一个。
Unclustered意味着它“仅”是一个逻辑顺序。
优点:
聚簇索引适用于范围(例如select * from my_table,其中my_key介于@min和@max之间)
在某些情况下,如果使用orderby语句,DBMS将不必进行排序。
缺点:
群集索引可以减慢插入速度,因为如果新密钥不按顺序排列,则必须在记录放入时修改记录的物理布局。
聚集索引实际上描述了记录物理存储在磁盘上的顺序,因此您只能拥有一个。
非群集索引定义与磁盘上的物理顺序不匹配的逻辑顺序。
聚簇索引本质上是索引列中数据的排序副本。
聚簇索引的主要优点是,当您的查询(搜索)在索引中查找数据时,不需要额外的IO来检索该数据。
维护聚簇索引的开销(尤其是在频繁更新的表中)可能导致性能不佳,因此可能最好创建非聚簇索引。