【问题标题】:Performance comparison of surrogate & composite key [closed]代理键和复合键的性能比较
【发布时间】: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


【解决方案1】:

在几乎所有测试中,代理键与自然键相比几乎没有性能优势。自然键还具有更易于使用的优点。 A better write-up is available here.

【讨论】:

  • 有趣的参考。
  • 此答案中的链接将我发送到“如何使用 Windows 2000 加密文件系统保护 SQL Server 数据库和备份影响 SQL Server 的性能”页面......似乎没有任何内容讨论一下 MySQL 中的代理键与自然键。
【解决方案2】:

性能不是选择是否实现代理主键的主要考虑因素。

我们发现理想的主键有几个理想的属性

  • 简单(单列,原生数据类型)
  • 唯一(绝对没有重复值)
  • 非空(每一行都有一个值)
  • 不可变(一旦分配它就从不改变)
  • 匿名(不携带“信息”)

没有“规则”规定被选为主键的候选键必须具有所有这些属性,但出于各种原因,这些属性是理想的。

甚至没有一条“规则”说所有表都需要有一个主键。但我们发现他们这样做是可取的。

使用代理键以及自然键构建了成功的软件系统。


就性能而言,并没有太大的差异可以证明。但请考虑这一点:如果实体表的主键是由多个“大”列组成的复合键,那么在任何具有外键的表中都必须重复这些相同的大列引用该实体表,并且在某些存储引擎 (InnoDB) 中,这些在 每个 索引中都会重复。

但性能并不是真正的决定因素。 (任何认为 性能 应该是选择候选键作为主键的决定因素的人都没有真正考虑过这一点。)


就“更易于使用”而言,许多开发人员发现使用单列作为主键与由两列、三列或更多列组成的复合键相比更容易

一些选择自然键作为主键的开发人员后来因选择候选键而被烧毁。不是因为它是自然键,而是因为在进一步的开发过程中,“新”需求被“发现”了,结果他们选择的候选键并不是真正的主键总是唯一的,或者它不能免于更改,或者它不是真正匿名的。

有很多软件项目使用 natural 键和 composite 键作为 PRIMARY KEY 取得了成功。就像使用 surrogate 键作为 PRIMARY KEY 一样成功。

【讨论】:

  • 我认为 RDBMS 中的“R”意味着 PK 要求
  • @Strawberry:完全可以发出不包含 PRIMARY KEY 约束的CREATE TABLE 语句。该表不需要 UNIQUE 约束,甚至不需要 NOT NULL 约束,是的,我们发现它需要添加一个主键。但严格来说,这不是一个要求。
  • 键(每个表至少一个)是关系定义的严格要求,因此必须始终存在于关系数据库中。根据 SQL 标准,SQL 中不需要键。如果 SQL 表缺少一组不可为空且不可约唯一的列,则它不是关系表。
  • (a) 有许多特定的规则 (2) RDBMS 中的 R 需要一个逻辑关系 PK,即“由数据组成”。 GUIDS、ID 等代理项不是由数据组成。它们是物理指针 (3) 代理打破了关系模型中的访问路径独立规则。 (4) 没有“代理键”之类的东西,它不具备 Key 的任何特性 (5) 不能放弃 Key,因为代理不提供行唯一性。 (6) 这不是一个非此即彼的决定,代理总是一个附加字段。
猜你喜欢
  • 1970-01-01
  • 2014-07-12
  • 2011-12-13
  • 2015-11-03
  • 2015-09-28
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多