【发布时间】:2015-08-05 20:39:12
【问题描述】:
如果一个数据库有属性A1,A2,A3...An和A1,A2&A3可以一起组成组合键,使用代理键而不是组合键更好吗?
使用代理键将提高记录的插入执行速度(这支持复合键的代理)但是SELECT、UPDATE和DELETE查询基于属性A1、A2 和 A3 如果我们使用代理键(这支持复合键而不是代理键),速度会大大降低。
在这种情况下,哪个性能更好?代理键还是复合键?
【问题讨论】:
-
这是一场持续的宗教战争。你永远找不到赢家。我留给你这个:它不会提高插入速度,它会减慢它。仅仅因为您有代理键,您的 A1、A2 和 A3 仍然是您的实际主键。因此,您需要对那些也有唯一的约束,这也意味着那里可能有一个索引。你现在有两个索引,你应该有一个。它所做的是意味着您在相关表上传播更少的数据(即 A1、A2、A3)。这将使它们更大,但也可能导致更少的连接。所以像往常一样,“这取决于”。
-
@LoztInSpace,如果我们使用
ID PRIMARY KEY AUTO_INCREMENT这样的代理键代替 PRIMARY KEY(A1, A2, A3),插入速度会大大提高 因为如果我们使用具有自动增量的轻量级主键,B-Tree 索引会快得多。因此,代理键通常会提高插入执行速度。 -
即使对于代理的插入本身比 3 列插入更快(我不一定同意这种说法),但您忽略了一个关键点:代理就是这样。它是真实事物的占位符。您仍然需要在实际的真实主键(A1、A2、A3)中强制执行唯一性。因此,您实际上需要通过引入代理键来完成 更多 工作。如果您选择不强制执行您的实际密钥,那么您实际上只是丢弃了您的数据模型,并且您不再拥有可以有意义地比较的两件事。有意义吗?
标签: mysql database composite-primary-key surrogate-key