Database design 索引外键列

Database design 索引外键列,database-design,Database Design,将索引放在所有外键列上是一条经验法则吗?它们似乎经常用于表联接,并从索引中获益 如果FK列只有2或3个可能的值,该怎么办?例如,如果它正在引用状态表。是否仍建议在FK字段上添加索引 编辑 我想重新回答这个问题。[建议将索引放在可能值很少(2或3)的列上吗?] 结束编辑不,不应该这样。索引只能在有用时使用。只有当表具有足够的大小(例如至少三个块)时,索引才可用。对于短行,很容易会有数百行。我强烈不同意Eelke-大多数SQL Server专家都会建议在外键列上放置非聚集索引,我同意 有关这些指数的

将索引放在所有外键列上是一条经验法则吗?它们似乎经常用于表联接,并从索引中获益

如果FK列只有2或3个可能的值,该怎么办?例如,如果它正在引用状态表。是否仍建议在FK字段上添加索引

编辑 我想重新回答这个问题。[建议将索引放在可能值很少(2或3)的列上吗?]
结束编辑

不,不应该这样。索引只能在有用时使用。只有当表具有足够的大小(例如至少三个块)时,索引才可用。对于短行,很容易会有数百行。

我强烈不同意Eelke-大多数SQL Server专家都会建议在外键列上放置非聚集索引,我同意

有关这些指数的最佳原因总结和最佳论证,请参阅金伯利·特里普(Kimberly Tripp)的优秀博客文章——答案是:从来没有——从来没有(这是许多长期存在的城市神话之一,但它仍然是一个神话)

她的核心信息是:

索引有什么好处吗 外键列

  • 在维持关系方面有更好的表现 删除主键/唯一键。什么时候 删除键行时,SQL Server必须 检查是否有行 其中引用了正在删除的行。
    o如果定义外键关系时未执行任何操作 (更新/删除时)然后引用 无法按原样删除行 将引用行保留为“孤立” 要高效地查找行,请使用索引 外键栏上的帮助
    o如果外键关系是通过级联定义的 (更新/删除时)然后 引用的行将在所有 引用行必须根据需要进行修改 嗯(更新以反映 新值(或在级联删除时)。到 查找要高效修改的行, 外键列上的索引 救命啊

  • 更好的连接性能-出于上述许多原因,SQL Server 可以更有效地找到要删除的行 在上联接表时联接到 主键/外键关系。 然而,这并不总是“最好的” 联接的索引选择,但它是一个 好的开始

(这里有两个问题:机器效率和DBA效率。)

根据经验,查询性能得益于JOIN子句和WHERE子句中使用的列索引。当然,insert、update和delete性能也会受到这些索引的影响。(因为索引必须随表一起更新。)

如果一个列的值很少,并且有一个令人信服的理由避免将实际值存储在表中,那么我更喜欢将可读代码作为外键引用的目标。例如,ISO 5218规定了这些表示人类性别的代码

Sex_id  Sex
--
0       Not known
1       Male
2       Female
9       Not applicable
我不希望人们记住9意味着不适用。如果这就是我所拥有的一切,那么每当我需要生成供人们阅读的输出时,我就必须加入这个表

但我可以向该表中添加一列,声明其唯一性,并将其用作外键引用的目标。我大部分时间都不必参加这个会议。见鬼,我可能永远都不需要参加。避免连接与机器效率有关

sex_id  sex_code   sex
--
0       Un         Not known
1       M          Male
2       F          Female
9       NA         Not applicable
所有这三列都应该声明为唯一的。在大多数平台上,这意味着这三列中的每一列都将得到一个索引。我也会索引引用sex_代码的列,即使选择性很低

为什么??我有比现在重新评估是否添加索引更好的事情要做,因为这个版本中的优化器足够聪明,可以利用它。这与DBA的效率有关

sex_id  sex_code   sex
--
0       Un         Not known
1       M          Male
2       F          Female
9       NA         Not applicable