【问题标题】:using normal primary key auto-increment or composite key in mysql在 mysql 中使用普通主键自增或复合键
【发布时间】:2015-12-22 16:34:26
【问题描述】:

对于 mysqlinoDB 引擎和最常使用 用于读取的表(与读取查询相比,创建和编辑不多)

表格用于博客平台(用户可以自己创建博客),这是我的两个表格架构选项:

例如表格帖子:

1: posts(id, blog_id, title, content) => id 是 唯一的主键 auto 递增

2: posts(id, blog_id, title, content) => 复合主键 是 (id, blog_id) 我在创建查询之前使用触发器来增加 id 专栏

在我的大多数查询中,有两种类型的 where:

1:用于检索单个帖子:

where id=5 解决方案一

where id=2 and blog_id=3 用于解决方案二

2:用于检索单个博客的多篇文章

where blog_id=3 解决方案一

where blog_id=3 用于解决方案二

问题:哪一种性能更好?

ps。如果我的问题不清楚,请告诉我更多解释。

【问题讨论】:

  • 我猜这与您选择的内容无关。
  • @JonStirling 我编辑问题

标签: php mysql database primary-key composite-primary-key


【解决方案1】:

简而言之,就性能而言,这并不重要。对于最常用的 DBMS,在大多数情况下,您不会发现两者之间有太大区别。

但是,要考虑的最重要的一点很简单:兼容性和易用性。大多数 ORM 系统和框架都经过调整以使用 PK 列。因此,如果您选择复合键,则始终需要进行一些调整。其次,如果您要在 Web 应用程序中采用 REST 方法,那么使用单数 ID 也会让您的生活更轻松。

【讨论】:

    【解决方案2】:

    如果使用“id, blog_id”的PK:那么索引中的前导列是“id”。

    如果您的查询是“where blog_id = 3” - 此不会使用索引,并且会很慢,因为 blog_id 不是前导列。

    由于 ID 是表中的唯一值 - 只需将其作为 PK 即可。否则会产生误导,有人可能会认为 ID 不是唯一的。

    如果您的查询经常使用“blog_id”作为条件,那么在该列上有一个二级索引。

    在我看来,自动递增“id”列比使用数据库触发器要好。它的活动部件更少,需要编写的代码也更少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-14
      • 2014-06-17
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多