MySQL Innodb:大型复合PK没有其他索引

时间:2012-12-29 13:50:50

标签: mysql primary-key innodb composite-index

我正在创建一个包含四列的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的PK列(A,B,C,D)。

问题

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

注意事项

  • 代理主键绝对不可能
  • 此表中不存在其他索引
  • 表是读/写密集型(两者大致相等)

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

需要考虑的一些事项:

  1. 除非有问题的查询使用索引中的所有列,否则不会使用索引。
  2. 正如jeremycole所说:在Innodb结构中,所有行数据都存储在聚集索引(PRIMARY INDEX)的B树叶子节点中
  3. 涵盖了这个概念: 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表上的所有值。