【问题标题】:Is indexes slow if I want to use foreign key?如果我想使用外键,索引会慢吗?
【发布时间】:2016-11-12 23:59:28
【问题描述】:

我想用foreign但是我应该添加索引。我听说索引插入很慢,这真的是个大问题,因为我需要添加外键的表角色有很多更新,插入,删除。我应该使用外键?我不想减慢查询速度

【问题讨论】:

  • 我觉得你工程过度了,负载测试看看性能如何,如果不能接受,那么你可以考虑调优..

标签: sql sql-server database-design foreign-keys foreign-key-relationship


【解决方案1】:

在以下情况下使用外键索引:

  • 父行即将被删除,
  • 父键(被外键引用)即将被修改。

(它在插入或更新父级的非引用字段时使用,也不在插入、更新或删除子级时使用。)

当然,“在”外键之上的查询(尤其是 JOIN)非常普遍,它们可能也可以从这些索引中受益。

因此,根据经验,如果您经常执行上述操作,请考虑在外键上建立索引。由于每个索引都需要maintenance,因此请衡量维护成本是否能证明您在这些操作上获得的加速(根据经验,通常是这样)。

【讨论】:

  • 我可以为不同的表使用很多外键(每个表只有 2 个索引其中一个外键)吗?例如,我有帖子表,并且有 image_id 和 user_id 这取决于其他表我应该给他们外键吗?(我的帖子表有很多选择,插入和很少更新)
  • 是的。您应该在任何合乎逻辑的地方使用 FK。事实上,为了“性能”而避免使用 FK 通常是 very bad idea - 您通常最终会失去完整性和性能。至于这些 FK 是否需要被索引,见上文。 ;)
【解决方案2】:

让我解释一下 SQL 索引和引用的实际整个概念

  • 当我们查找特定页面/内容/主题时,索引与我们书籍中的正常索引相同,而不是一页一页地引用我们在索引中看到的并找出它的地址。
  • 引用用于维护特定表或列之间的关系
  • 当您执行任何操作[不包括插入]时,SQL 如何准确地工作,他们首先要搜索这些数据。首先它会检查索引[如果可用],否则会逐行搜索数据。
  • 因此,如果您有索引,则可以使所有操作更快[您必须根据您正在执行的大部分操作(如 ID,...] -如果有关系,你也可以在你的代码中维护[只有当你对数据库及其流程有深入了解时才选择这个选项]

建议必须[仅在一个字段上]使用索引,是的,根据您的需要使用关系,它永远不会降低您的性能

【讨论】:

  • 但是当我为例如帖子表创建表并且有帖子ID(主键)和user_id并且它们都应该有索引因为主键本身是索引并且我应该=d使用另一个user_id 的索引,因为它是外键。我怎样才能只使用一个索引?
  • 我的意思是每个表一个索引,对于外键,你不需要应用索引,因为它直接引用主键[如果你不需要在主键上建立索引,你也可以阻止它们主键]
  • 但在我的示例中,我需要主键,因为帖子 ID 应该是自动增量
  • 你做主键只是为了自动递增吗?您也可以在不应用主键的情况下使其自动递增。
  • 是的,我知道,但如果我这样做,帖子 ID 可能会重复,并且主键会阻止它
猜你喜欢
  • 2010-10-24
  • 2011-12-22
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2017-09-18
  • 2011-08-24
  • 2011-08-22
相关资源
最近更新 更多