使用外键加速表加入

时间:2015-04-01 19:20:33

标签: mysql performance join foreign-keys

我认为我的标题非常自我解释,但我会在下面概述我正在做的事情。

一个人与城镇相连。这个镇与一个县相连。该县与一个国家相连。一个国家有很多县。一个县也有许多城镇。据说很多人可以来自同一个城镇。

在我的数据库中,我有一个单独的表格,供人们,城镇,县和国家使用。为了获得完整的用户记录,我LEFT JOIN记录集上的表。这是我所做的简单版本,因为一个单数的人分布在更多的桌子上。是否使用FOREIGN键可以加快查询的执行速度?即使只是稍微增加速度或减少资源使用量,我也会感兴趣。

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

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

3 个答案:

答案 0 :(得分:4)

外键不会直接加快查询的执行速度。它们确实具有间接效果,因为它们保证引用的列被索引。该指数将对业绩产生影响。

在描述问题时,所有连接关系都应包含其中一个表的主键。生成的查询应该是非常有效的执行。

我不担心查询的5或6个连接 - 除非你有非常大量的数据(多个表有数百万行)。或者你处在一个严重受记忆限制的环境中。

答案 1 :(得分:1)

无论何时添加外键,您都应该为密钥编制索引,这样至少可以加快查询速度,但除此之外,它们并非旨在提高性能。但是,使用外键是个好主意,因为它们可以确保数据的完整性。对键进行索引是可以加速它的部分,但无论如何你仍然应该使用外键。

答案 2 :(得分:1)

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

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