【问题标题】:MySQL. Primary key in a relational table. Unique id or multiple unique key?mysql。关系表中的主键。唯一 ID 还是多个唯一键?
【发布时间】:2011-09-16 08:31:44
【问题描述】:

关系表中的主键。那些纯关系表中的复合主键还是唯一主键?

您会推荐在 MySQL 中使用哪种设计以获得高性能? See diagram

技术优势和劣势!

谢谢大家!

【问题讨论】:

  • 如果你想要性能,完全放弃外键。如果您想要正确的数据库设计和关系模型 - 使用一种有效的,而不考虑性能影响。
  • “如果您想要性能,请完全删除外键”。那将是愚蠢的。外键可以通过改进某些查询的执行计划来提高性能。在任何情况下,没有约束的架构在功能上并不等同于有约束的架构,因此开始比较它们之间的性能有点武断。

标签: mysql database database-design primary-key primary-key-design


【解决方案1】:

这实际上取决于您正在执行的查询类型...

如果您添加一个额外的代理项,您最终将执行两次 唯一检查,而不是每次插入、更新和删除都进行一次检查。这使得复合键听起来正确。

但是,如果您经常在其他外键中引用该主键,那么复合选项意味着您最终会存储两倍的信息,并且在加入时需要做更多的工作。这使得单键听起来正确。

【讨论】:

    【解决方案2】:

    根据 Elmasri 和 Navathe(在数据库系统基础中),您应该选择选项 A,因为人工主键是不必要的,并且建议您进行非规范化设计(他们的 POV)。

    在连接表的情况下,我碰巧同意作者的观点。否则我认为在实践中使用人工键是非常好的。

    我认为连接表的性能影响不会很大。

    【讨论】:

      【解决方案3】:

      我同意@Denis,这取决于你在做什么。要考虑的另一件事是 InnoDB 将以 PK 顺序将行存储在磁盘上。如果您正在执行id1 BETWEEN a AND b 之类的操作,这一点非常重要。每次移动这些读头大约需要 10 毫秒,如果查询的行是分散的,它会加起来。正是出于这些原因,您可能会考虑非规范化以将您需要的数据放在一行中。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2020-11-04
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多