“您最常查询的内容”不一定是选择集群索引的最佳理由。最重要的是您查询什么以获得多行。集群是一种适合于高效地以最少的磁盘读取次数获得多行的策略。
最好的例子是客户的销售历史。
假设您在 Sales 表上有两个索引,一个在 Customer 上(可能还有日期,但这一点适用于任何一种方式)。如果您最常在 CustomerID 上查询该表,那么您会希望将所有客户的销售记录放在一起,以便为所有记录提供一到两次磁盘读取。
主键 OTOH 可能是代理键或 SalesId,但在任何情况下都是唯一值。如果这是聚集的,与普通的唯一索引相比,它没有任何好处。
编辑:让我们来讨论这个特定的表格 - 它会揭示更多的微妙之处。
“自然”主键很可能是 parentid + childid。但按什么顺序?Parentid + childid 并不比 childid + parentid 更独特。出于聚类目的,哪种排序更合适?有人会假设它必须是 parentid + childid,因为我们会想问:“对于给定的项目,它的成分是什么”?但是,不是不太可能想要走另一条路,并询问“对于给定的成分,它是哪些项目的组成部分?”。
加入“覆盖索引”的考虑,在索引中包含满足查询所需的所有信息。如果这是真的,那么您永远不需要阅读记录的其余部分;所以集群是没有好处的;只需阅读索引就足够了。(顺便说一句,这意味着同一对字段上的两个索引,顺序相反;在这种情况下,这可能是正确的做法。或者至少一个上的复合索引,另一个上的单字段索引。 )
但这仍然不能决定哪个应该集群。这最终可能取决于哪些查询实际上需要获取 Quantity 字段的记录。
即使是这样一个清晰的例子,原则上最好在您可以用真实数据测试它们之前(显然是在生产之前)对其他索引做出决定;但是在这里问猜测是没有意义的。测试总是会给你正确的答案。
忘记担心会减慢插入速度,直到遇到问题(在大多数情况下永远不会发生),并且可以测试以确保放弃有用的索引以获得可衡量的好处。
但是,事情仍然不确定,因为像这样的联结表也经常涉及许多其他类型的查询。因此,我只需要选择一个并根据需要进行测试,因为应用程序凝胶化,并且用于测试的数据量变得可用。
顺便说一句,我希望它最终会在 parentid + childid 上进行 PK;childid 的非唯一索引;和第一个集群。如果您更喜欢代理 PK,那么您仍然需要 parentid + childid 上的唯一索引,聚集。对代理键进行聚类不太可能是最优的。