如果表A具有fk1和fk2,并且该表经常与fk1和fk2连接,但很少同时使用。假设fk1 + fk2是唯一的。
该表是否应该有一个索引fk1_and_fk2,并且该表是否应该聚集在该索引上?
或者该表是否应该在fk1上有一个索引,另一个在fk2上并且聚集在其中一个上?
答案 0 :(得分:1)
如果我们只考虑查询,那么您应该有一个自动递增的主键,并将(fk1, fk2)
和(fk2, fk1)
定义为唯一。这假设这些列永远不会NULL
。或者,您可以通过其他方式定义它。 (如果它们不是unique
,您只需定义一个索引。)
这将加速两种类型的查询。此外,仅使用这些列的查询可以直接使用索引,而无需引用原始数据页。
通过使用自动递增/标识/生成的始终/串行主群集密钥,插入更快,因为它们总是位于表的末尾。 (当然,您确实可以在页面中间插入索引。)
缺点?
类似的替代方案是让其中一对成为主(聚集)索引。这方面的缺点是新插入页面溢出。