【问题标题】:MYSQL Innodb: Composite Primary Key and Reverse SearchMYSQL Innodb:复合主键和反向搜索
【发布时间】:2012-12-27 05:29:19
【问题描述】:

我正在使用 Innodb 搜索引擎为用户查找表创建一个事件。

表 Event_Users

event_id
user_id

Index (PRIMARY) -> event_id, user_id
Index (secondary) -> user_id, event_id ??

应用程序将搜索用户到事件和事件到用户。如果主键是聚集的,如何定义第二个索引?它应该只是 user_id 然后 MYSQL 会发现 event_id 已经存在于 PK 中还是我应该是多余的并在二级索引中包含 user_id, event_id

另外,这对聚集索引有用吗?任何有关 Innodb 聚集索引的指导和帮助将不胜感激。谢谢!

【问题讨论】:

  • 什么是secondary index btw?
  • 普通非唯一索引。没什么特别的,但它会像 PK 一样被使用
  • 如果您将二级索引保留为复合索引,那么如果您不需要检索其他列,它可以用作covering index
  • 我做了一些额外的研究,MySQL 应该能够使用 PK 中的字段作为覆盖索引,而无需制作复合二级索引。复合二级索引可以大大减慢插入和更新速度。该表将是重读/写

标签: mysql innodb composite-primary-key


【解决方案1】:

MySQL 应该能够将 PK 中的字段用作覆盖索引,而无需制作复合二级索引。

因此:

表(引擎 = INNODB)

column_a  (int)
column_b  (int)

Primary Key -> column_a, column_b

如果您想通过column_b 进行搜索,只需添加索引:column_b

由于表使用了Innodb引擎,所以PK会存在column_b索引中。 mysql就能使用索引(using index)。无需创建索引column_b, column_a,因为这将是多余的。 - 请记住,inndob 集群由 PK 和所有索引引用 PK。

代理键对于这种设计来说是一个糟糕的选择,因为必须进行额外的工作以确保 column_a, column_b 不存在。

【讨论】:

  • 如果只使用单个复合索引(column_b, column_a)(主键与否),则不需要添加索引(column_b) - MySQL 将在通过column_b 搜索时使用它。但是,您需要在(column_a) 上有索引,以便通过column_a 进行查找。所以,如果你建议只有单个索引(column_b,column_a),这个解决方案是不正确的。
  • 没错,但我犯了一个错误。主键应为 -> column_a, column_b。我现在已经修好了。
猜你喜欢
  • 1970-01-01
  • 2016-11-08
  • 2013-04-30
  • 1970-01-01
  • 2015-05-12
  • 2011-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多