Sql 如果我想使用外键,索引速度慢吗?

Sql 如果我想使用外键,索引速度慢吗?,sql,sql-server,database-design,foreign-keys,foreign-key-relationship,Sql,Sql Server,Database Design,Foreign Keys,Foreign Key Relationship,我想使用外键,但我应该添加索引。我听说索引插入速度慢,这是一个很大的问题,因为我需要添加外键的表的角色有很多更新、插入和删除。我应该使用外键吗?我不想减慢我的查询速度。让我解释一下SQL索引和引用的实际整体概念 当我们在寻找特定的页面/内容/主题时,索引与我们书籍中的普通索引是一样的,而不是一页一页地引用我们在索引中看到的页面并找出它的地址 引用用于维护特定表或列之间的关系 SQL究竟是如何工作的当您执行任何操作[不包括插入]时,他们将首先搜索这些数据。首先,它将签入索引[如果可用],否则将逐

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

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

  • 当我们在寻找特定的页面/内容/主题时,索引与我们书籍中的普通索引是一样的,而不是一页一页地引用我们在索引中看到的页面并找出它的地址
  • 引用用于维护特定表或列之间的关系
  • SQL究竟是如何工作的当您执行任何操作[不包括插入]时,他们将首先搜索这些数据。首先,它将签入索引[如果可用],否则将逐行搜索数据
  • 所以,若你们有一个索引,你们可以使所有的操作更快[你们必须在你们正在执行的大部分操作的基础上对那个些列进行索引,比如ID,…] -在这种情况下,您还可以在代码中维护关系[仅当您对数据库及其流程有深入了解时才选择此选项]

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

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

  • 父行即将被删除
  • 父项的键(由外键引用)即将被修改
(插入或更新父项的非引用字段时,以及插入、更新或删除子项时,不使用该选项。)

当然,外键的查询(特别是连接)“在上面”是很常见的,它们也可能受益于这样的索引


所以,作为一个经验法则,如果你经常做上述操作,考虑在外键上有索引。由于每个指标都要求,请衡量维护价格是否证明您在这些操作中获得的加速是合理的(根据经验法则,通常是这样)。

我认为您在设计、负载测试和性能测试方面做得太过火了,如果不可接受,然后您可以考虑调整..但当我为examle posts表创建表时,有post id(主键)还有用户id,它们都应该有索引,因为主键本身就是索引,而且我应该为用户id使用另一个索引,因为它是外键。我怎么能只使用一个索引呢?我的意思是每个表一个索引,外键不需要应用索引,因为它直接引用主键[如果不需要在主键上建立索引,也可以防止它们成为主键]但在我的例子中,我需要主键,因为post id应该是自动递增的。您是否只为自动递增而使用主键?您也可以在不应用主键的情况下使其自动递增。是的,我知道,但如果我这样做,posts id可以重复,并且主键可以防止它。我可以为不同的表使用很多外键吗(每个表只有2个索引,其中一个是外键)?例如,我有posts表,有image_id和user_id,这取决于其他表,我应该给它们外键吗?(我的post表有很多选择、插入和少量更新)是的。你应该在任何地方使用FKs,这样做是合乎逻辑的。事实上,为了“性能”避免使用FKs通常是a-您通常会失去完整性和性能。至于这些FK是否需要索引,请参见上文。;)谢谢,这很有帮助