【问题标题】:Does using Foreign Key speed up table joins是否使用外键加速表连接
【发布时间】:2015-04-01 19:20:32
【问题描述】:

我认为我的标题很自我解释,但是我将在下面概述我在做什么。

一个人与一个城镇相连。这个镇与一个县相连。该县与一个国家相连。一个国家有很多县。一个县也有很多镇。话虽如此,很多人可以来自同一个城镇。

在我的数据库中,我有一个单独的表格,用于记录人员、城镇、县和国家/地区。为了获得完整的用户记录,我 LEFT JOIN 记录集上的表。这是我作为一个单独的人所做的工作的简化版本,分布在更多的桌子上。使用 FOREIGN 键会加快我的查询的执行速度吗?即使只是速度略有提高或资源使用量减少,我也会感兴趣。

我计划的规模非常大,因此执行时间和资源使用可能很有用。对于一个从数据库返回的人来说,我对多个表大约有 5-6 个联接。

edit 到目前为止,我想指出我正在使用主键和唯一键为每个表编制索引。此外,数据集可以在一个表(人)中快速添加数百万行,因此性能是关键。

【问题讨论】:

    标签: mysql performance join foreign-keys


    【解决方案1】:

    外键不会直接加速查询的执行。它们确实有间接影响,因为它们保证引用的列被索引。并且索引会对性能产生影响。

    正如您描述的问题,所有连接关系都应包括其中一张表的主键。生成的查询应该是非常有效的执行。

    我不会担心查询的 5 或 6 个连接 - 除非您有非常大量的数据(超过一个具有数百万行的表)。或者您处于内存严重受限的环境中。

    【讨论】:

      【解决方案2】:

      每当您添加外键时,您确实应该为该键编制索引,这样至少可以加快您的查询速度,但除此之外,它们并不是为了提高性能而设计的。但是,使用外键是个好主意,因为它们可以确保数据的完整性。索引键是加快速度的部分,但无论如何您仍应使用外键。

      【讨论】:

        【解决方案3】:

        一般来说,外键用于数据完整性(也称为引用完整性),以确保具有外键的字段实际上引用了另一个表中的记录。因此,虽然它不会对查询性能产生太大影响,但它会稍微降低插入性能(因为在插入期间必须对另一个表执行检查)。

        为了提高查询性能,您应该使用索引。但请注意,虽然索引会显着加快对大型数据集的查询速度,但它也会(再次)略微降低插入记录的性能。

        【讨论】:

          猜你喜欢
          • 2012-03-29
          • 2018-12-07
          • 2013-09-10
          • 2018-09-09
          • 2011-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          相关资源
          最近更新 更多