MySQL Innodb:大型复合PK无其他索引
我正在创建一个包含四列的Innodb表 桌子 从逻辑角度来看,a、B、C列必须一起组成PK。但是,为了提高性能并能够直接从索引中读取(使用索引),我正在考虑一个包含所有4列(a、B、C、D)的PK 问题: 在Innodb表的主键上追加一列会有什么样的性能 考虑MySQL Innodb:大型复合PK无其他索引,mysql,primary-key,innodb,composite-index,Mysql,Primary Key,Innodb,Composite Index,我正在创建一个包含四列的Innodb表 桌子 从逻辑角度来看,a、B、C列必须一起组成PK。但是,为了提高性能并能够直接从索引中读取(使用索引),我正在考虑一个包含所有4列(a、B、C、D)的PK 问题: 在Innodb表的主键上追加一列会有什么样的性能 考虑 代理主键是绝对不可能的 此表上不存在其他索引 表是读/写密集型的(两者大约相等) 谢谢大家! 需要考虑的几件事: 除非所讨论的查询使用索引中的所有列,否则不会使用索引 正如jeremycole所指出的:在Innodb结构中,所有行数据
- 代理主键是绝对不可能的
- 此表上不存在其他索引
- 表是读/写密集型的(两者大约相等)
谢谢大家! 需要考虑的几件事:
因此,对a、B、C的查询就足以有效地获取此Innodb表上的所有值 在InnoDB中,
主键
索引结构包括所有非键字段,并将自动使用它们来覆盖索引查询和行消除。除了主键
索引结构之外,没有单独的“数据”结构。无需向主键定义本身添加其他字段。请注意,当它在InnoDB表上使用主键时,它不会显示使用索引的,因为它是一个不同的代码路径,不会触发添加该消息。将列d
添加到您的PK将意味着可以在(a列、b列、c列)
只要列d
不同。还有,为什么不在表中添加其他索引:如果你想要一个覆盖索引,为什么不在PK之外添加一个呢?记住,过早优化是万恶之源-你真的面临着你试图解决的性能问题吗?如果是,那是什么?非常好的观点hcolumn\u d
,我问是否有经验法则或指导原则。有很多表都有大型PK,我希望得到指导。谢谢。对不起,但这个答案不正确。InnoDB中的主键
索引结构包括所有非键字段作为其“值”,这意味着没有单独的“数据”结构(例如MyISAM.MYD
文件)。为这种情况创建单独的覆盖索引弊大于利。jeremy完全正确,关于我先前的错误答案。
column_a (tiny_int)
column_b (medium_int)
column_c (timestamp)
column_d (medium_int)
Primary Key -> column_a, column_b, column_c