使用外键是否加速 table 连接
Does using Foreign Key speed up table joins
我认为我的标题很容易解释,但是我将在下面概述我在做什么。
一个人与一个城镇相连。这个镇与一个县相连。县与国家相连。一个国家有很多县。一个县也有很多城镇。话虽如此,很多人可能来自同一个城镇。
在我的数据库中,我有一个单独的 table 用于人、城镇、县和国家。为了获得完整的用户记录,我在记录集上留下了 tables。这是我作为一个单一的人所做的工作的简化版本,分布在更多 table 中。使用外键会加快查询的执行速度吗?即使只是速度略有提高或资源使用量减少,我也会感兴趣。
我计划的规模很大,所以执行时间和资源使用可能会有用。对于从数据库返回的一个人,我有大约 5-6 个连接用于多个 tables。
edit 对于到目前为止的答案,我想指出我正在使用主键和唯一键为每个 table 编制索引。此外,数据集可以在一个table(人)中快速添加多达数百万行,因此性能是关键。
外键不会直接加速查询的执行。它们确实有间接的影响,因为它们保证被引用的列被索引。而且索引会对性能产生影响。
正如您所描述的问题,所有连接关系都应包括 table 之一的主键。生成的查询应该非常有效地执行。
我不会担心查询的 5 或 6 个连接——除非你有非常大量的数据(超过一个 table 有数百万行)。或者您处于内存严重受限的环境中。
无论何时添加外键,您都应该为该键建立索引,这样至少会加快您的查询速度,但除此之外,它们并不是为了提高性能而设计的。但是,使用外键是个好主意,因为它们可以确保数据的完整性。索引键是可以加快速度的部分,但无论如何你仍然应该使用外键。
一般来说,外键用于数据完整性(也称为参照完整性),以确保具有外键的字段实际引用另一个 table 中的记录。因此,虽然它不会对查询性能产生太大影响,但它只会稍微降低插入性能(因为在插入期间必须对另一个 table 执行检查)。
为了加快查询性能,您应该使用索引。但请注意,虽然索引会显着加快对大型数据集的查询,但它也会(再一次)稍微降低插入记录的性能。
我认为我的标题很容易解释,但是我将在下面概述我在做什么。
一个人与一个城镇相连。这个镇与一个县相连。县与国家相连。一个国家有很多县。一个县也有很多城镇。话虽如此,很多人可能来自同一个城镇。
在我的数据库中,我有一个单独的 table 用于人、城镇、县和国家。为了获得完整的用户记录,我在记录集上留下了 tables。这是我作为一个单一的人所做的工作的简化版本,分布在更多 table 中。使用外键会加快查询的执行速度吗?即使只是速度略有提高或资源使用量减少,我也会感兴趣。
我计划的规模很大,所以执行时间和资源使用可能会有用。对于从数据库返回的一个人,我有大约 5-6 个连接用于多个 tables。
edit 对于到目前为止的答案,我想指出我正在使用主键和唯一键为每个 table 编制索引。此外,数据集可以在一个table(人)中快速添加多达数百万行,因此性能是关键。
外键不会直接加速查询的执行。它们确实有间接的影响,因为它们保证被引用的列被索引。而且索引会对性能产生影响。
正如您所描述的问题,所有连接关系都应包括 table 之一的主键。生成的查询应该非常有效地执行。
我不会担心查询的 5 或 6 个连接——除非你有非常大量的数据(超过一个 table 有数百万行)。或者您处于内存严重受限的环境中。
无论何时添加外键,您都应该为该键建立索引,这样至少会加快您的查询速度,但除此之外,它们并不是为了提高性能而设计的。但是,使用外键是个好主意,因为它们可以确保数据的完整性。索引键是可以加快速度的部分,但无论如何你仍然应该使用外键。
一般来说,外键用于数据完整性(也称为参照完整性),以确保具有外键的字段实际引用另一个 table 中的记录。因此,虽然它不会对查询性能产生太大影响,但它只会稍微降低插入性能(因为在插入期间必须对另一个 table 执行检查)。
为了加快查询性能,您应该使用索引。但请注意,虽然索引会显着加快对大型数据集的查询,但它也会(再一次)稍微降低插入记录的性能。