代码之家  ›  专栏  ›  技术社区  ›  Chaowlert Chaisrichalermpol

外键是否提高了查询性能?

  •  132
  • Chaowlert Chaisrichalermpol  · 技术社区  · 15 年前

    SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
    FROM Products p
    INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
    WHERE c.CategoryId = 1;
    

    当我创建执行计划时,表ProductCategories执行集群索引查找,这与预期一样。但对于表产品,它执行集群索引扫描,这让我感到怀疑。为什么FK无助于提高查询性能?

    所以我必须在Products.CategoryId上创建索引。当我再次创建执行计划时,两个表都执行索引查找。估计子树成本大大降低。

    1. 除了FK有助于关系约束之外,它还有其他用处吗?它是否提高了查询性能?

    2. 我应该在所有表中的所有FK列(liked Products.CategoryId)上创建索引吗?

    9 回复  |  直到 7 年前
        1
  •  198
  •   onedaywhen    12 年前

        2
  •  64
  •   Andrzej Doyle    11 年前

    外键可以提高(并损害)性能

    1. 如下文所述: Foreign keys boost performance

    2. 您应该始终在FK列上创建索引以减少查找。SQL Server不会自动执行此操作。

    因为链接现在似乎已经死了 (感谢克里斯的关注) ,下面显示外键可以提高(并损害)性能的要点。

    Can Foreign key improve performance

    在读取查询时,优化器可以使用外键约束 约束是预先声明的规则。这通常包括跳绳 查询计划的某些部分,例如优化器可以看到 由于外键约束,不需要执行 计划的那一部分。

        3
  •  17
  •   Matthew Haugen    7 年前

    外键是确保数据库完整性的DBMS概念。

    任何性能影响/改进都将特定于所使用的数据库技术,并且与外键的用途相比是次要的。

    在SQL Server中,确保所有外键上至少有一个非聚集索引是一种很好的做法。

    我希望这为你澄清了一切,但请随时要求更多的细节。

        4
  •  3
  •   Al Katawazi    15 年前

    最好的性能选择是在经常使用的字段上使用索引。如果使用SQL Server,则可以使用探查器评测特定数据库,获取输出的文件,并使用“调优向导”接收有关索引放置位置的建议。我还喜欢使用分析器清除长时间运行的存储过程,我每周都会发布十大最糟糕的违规者名单,让人们保持诚实:D。

        5
  •  3
  •   Josh G    3 年前

    您可以使用它来帮助提高查询效率。它确实允许您在SQL Server中重新构造查询,以使用外部联接而不是内部联接,这将使SQL Server无需检查列中是否有null。您不需要输入那个限定符,因为外键关系已经为您提供了信息。

    因此:

    select p.ProductId, p.Name, c.CategoryId, c.Name AS Category 
    from Products p
    inner join ProductCategories c on
    p.CategoryId = c.CategoryId
    where c.CategoryId = 1;
    

    变成这样:

     SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category 
     FROM ProductCategories c 
     LEFT OUTER JOIN Products P ON
     c.CategoryId = p.CategoryId 
     WHERE c.CategoryId = 1;
    

    这不一定会在小查询中产生巨大的性能,但当表变大时,它会更有效。

        6
  •  2
  •   Shamik    15 年前

        7
  •  2
  •   Pankaj Khairnar    13 年前

    在表中添加外键不会提高性能,简单地说,如果在ProductCategories表数据库中插入记录,将尝试查找外键列的值,该值存在于products表的主键值中,每次在ProductCategories表中添加新条目时,操作都会增加数据库的开销。 因此,通过添加外键不会提高数据库性能,但会考虑数据库的完整性。

        8
  •  2
  •   Peter Bartlett    6 年前

    对于MySQL5.7来说,它绝对可以很好地加速涉及多个连接的查询!

    我使用“explain”来理解我的查询,发现我加入了4-5个表,其中根本没有使用键。我只向这些表添加了一个外键,结果是加载时间减少了90%。花费了>5秒现在需要500毫秒或更短时间。

    而且,正如其他人所提到的,您还可以获得确保关系完整性的额外好处。

    除此之外,确保引用完整性也有其自身的性能优势。它具有确保具有外键的表与外键表“最新”的二阶效果。假设您有一个users表和一个comments表,并且您正在comments表上进行一些统计。可能如果你硬删除用户,你也不再需要他们的评论了。

        10
  •  0
  •   Alex from Jitbit    3 年前

    是的,FK可以加速 SELECT 但是慢一点 INSERT/UPDATE/DELETE

    约束条件(包括FK),以建立更好的执行计划 选择

    例如,如果使用 Column1 = X X 如果不符合约束条件,服务器甚至不会触摸桌子。

    "untrusted" state ,但这是一个完全不同的故事。

    s,除非此列上有非聚集索引