聚集索引和唯一索引有什么区别?

17
我刚开始学习SQL Server中的索引,但是对于聚集索引和唯一索引感到困惑。如果两者都应用于具有唯一键列(例如:PersonID)的列,那么它们之间有什么区别呢?
谢谢。

2
基本上,索引的群集和唯一性是两个不同且独立的特点。 - Andriy M
1
@Andriy M - 你应该把那个作为答案发布。 - JeffO
1
@Jeff O:谢谢。那不会满足OP的最终要求,而我也不能保证自己能给出更完整的答案。 - Andriy M
4个回答

43

两者没有关联:

  • "Unique" 确保每个值仅出现一次
  • "Clustered" 是数据在磁盘上的排列方式

有四种排列组合:

  • "unique non-clustered"
  • "unique clustered"
  • "non-unique non-clustered"
  • "non-unique clustered"

有些人会因为 SQL Server 中 "primary key"(PK)的默认设置是聚集,而感到困惑。

"Primary key" 必须始终是唯一的。 "unique" 和 "PK" 之间的差异在于唯一允许一个 NULL,而 PK 不允许任何 NULL。

最后,一些数字限制:

  • 因为 clustered 指的是磁盘上的布局,所以每个表只能有一个聚集索引
  • 一张表不能有多个主键,但可以拥有多个唯一索引

@iMatoria:是的,有两个注释:1. 在SQL Server中,默认情况下,PK将会被聚集。2. PK不允许NULL值,“唯一聚集”允许一个。 - gbn
考虑到这一点,PK并不属于上述4个排列之一?还是说有两个更多的排列方式:1.聚集的。2.非聚集的。如果我漏掉了什么已经被你提到的东西,抱歉。 - iMatoria
1
@iMatoria:当您创建主键(CREATE/ALTER TABLE)或索引(CREATE INDEX)时,可以提到CLUSTERED或NONCLUSTERED(没有第三个选项)。如果您不提及它,它将默认为PK的CLUSTERED,索引的NONCLUSTERED。因此,基本上,是的,PK是“唯一聚集”的:我试图解释为什么会这样,抱歉。有时(不是很常见),您会发现一个NONCLUSTERED PK与另一个CLUSTERED索引一起使用可以更好地满足您的查询需求。 - gbn
太棒了,那解释非常完美。点赞!如果我必须总结你之前有关PK的两条评论,那就是:PK是带有不允许NULL值的“唯一聚集”索引,这就是PK与唯一键的简单区别。无论如何,谢谢。 - iMatoria
1
在PK和UQ之间还有一个区别,即您可以在表中仅声明一个PK,而您可以在表中声明多个UQ。 - kashif
给一个非唯一、非聚集索引的例子。 - amarnath harish

20

一个唯一索引只是一个具有唯一约束的索引,没有更多,也没有更少。聚集索引将数据在磁盘上物理排序以匹配索引。如果您仅通过一个列(例如主键)经常访问表中的数据,则它非常有用。此外,一张表只能有一个聚集索引(当然是显而易见的)。


1
当您向表中插入数据时,通常没有特定的顺序。它只是被插入到某个地方。当您有一个聚集索引时,磁盘上的数据将按照您创建聚集索引的键进行排序。例如,您有一个带有整数字段ifield的表,并在其上创建了一个聚集索引。然后,磁盘上的数据将按照整数字段ifield升序排序。首先是ifield = 1的记录,然后是ifield = 2的记录,依此类推。 - ckruse
再次感谢,但我还有一个关于这个问题的问题,每个表在定义任何主键时默认都有一个聚集索引吗?还是我们需要自己创建它。 - BreakHead
2
不,默認情況下沒有聚集索引。聚集索引會產生廣泛的影響。每個UPDATE、INSERT或DELETE語句都可能變得非常緩慢,因為DBMS必須在磁盤上重新排序表。只有在真正需要它們或者確定UPDATE/DELETE/INSERT非常罕見時才使用聚集索引。 - ckruse
2
在SQL Server中,pk默认是聚集索引。 - Magnus
@ckruse:当你说“唯一索引只是带有唯一约束的索引..”时,你是指“具有唯一约束的非聚簇索引”吗?此外,这是否意味着该列中无法输入重复值? - iMatoria
显示剩余4条评论

10

一个粗略的思路是将其比作电话簿。聚集索引是页面书写顺序。任何其他索引都是单独的列表,显示要转到哪个页面。

例如,电话簿按姓氏“聚集”,但您可能还想通过街道查找,因此您会有一个单独的列表,显示住在假街上的人在第3页、第45页和第63页等。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接