【问题标题】:MySQL Innodb: Large Composite PK no other indexesMySQL Innodb:大型复合 PK 没有其他索引
【发布时间】:2012-12-29 13:50:50
【问题描述】:

我正在创建一个包含四列的 Innodb 表。

表格

 column_a (tiny_int)
 column_b (medium_int)
 column_c (timestamp)
 column_d (medium_int)

 Primary Key -> column_a, column_b, column_c

从逻辑的角度来看,A、B、C 列必须一起组成一个 PK。但是,为了提高性能并能够直接从索引中读取(使用索引),我正在考虑一个包含所有 4 个的 PK列(A、B、C、D)。

问题

在 Innodb 表的主键上附加一个额外的列会有什么表现?

注意事项

  • 代理主键绝对不可能
  • 此表上不存在其他索引
  • 表是读/写密集型(两者差不多)

谢谢!

【问题讨论】:

  • column_d 添加到您的PK 将意味着只要column_d 不同,就可以在(column_a, column_b, column_c) 中得到多个具有相同值的记录。另外,为什么要拒​​绝向表中添加其他索引:如果您想要一个覆盖索引,为什么不添加一个除了 PK?请记住,过早的优化是万恶之源 - 您是否真的面临着要解决的性能问题?如果有,是什么?
  • column_d 的观点非常好,我想知道是否有经验法则或一些指导原则。有相当多的桌子有很大的 PK,我希望得到指导。谢谢

标签: mysql primary-key innodb composite-index


【解决方案1】:

在 InnoDB 中,PRIMARY KEY 索引结构包括所有非键字段,并将自动使用它们来覆盖索引查询和行消除。除了PRIMARY KEY 索引结构之外,没有单独的“数据”结构。无需向PRIMARY KEY 定义本身添加其他字段。请注意,当它在 InnoDB 表上使用 PRIMARY KEY 时,它不会显示 Using index,因为它是不同的代码路径,不会触发添加该消息。

【讨论】:

    【解决方案2】:

    需要考虑的几点:

    1. 除非相关查询使用索引中的所有列,否则不会使用索引。
    2. 正如 jeremycole 所说:在 Innodb 结构中,所有行数据都存储在聚集索引 (PRIMARY INDEX) 的 B 树叶节点中

    涵盖了这个概念: http://www.innodb.com/wp/wp-content/uploads/2009/05/innodb-file-formats-and-source-code-structure.pdf http://blog.johnjosephbachir.org/2006/10/22/everything-you-need-to-know-about-designing-mysql-innodb-primary-keys/

    ... 在 jeremy 的博文中: http://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/

    因此,对 A、B、C 的查询足以有效地获取此 Innodb 表上的所有值。

    【讨论】:

    • 对不起,这个答案是不正确的。 InnoDB 中的 PRIMARY KEY 索引结构包括所有非键字段作为其“值”,这意味着没有单独的“数据”结构(例如 MyISAM .MYD 文件就是这种情况)。为这种情况创建一个单独的覆盖索引弊大于利。
    • jeremy 是绝对正确的,关于我之前的错误答案。
    猜你喜欢
    • 2011-06-06
    • 2011-06-28
    • 2015-05-12
    • 1970-01-01
    • 2013-07-06
    • 2012-10-14
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多