假设我有一个包含3个varchar(256)列的复合主键的表:A,B和C. B上还有一个索引,复合键作为A的索引。这个表有数百万行,有很多INSERTS
和SELECTS
,但没有UPDATES
(ON DUPLICATE KEY UPDATE
与INSERTS
一起使用除外)。
如果我将此表更改为具有md5(A,B,C)的单个列char(32)主键(以及A上的索引和B上的索引),则此设置对于INSERTS更有效?碰撞的可能性并没有打扰我。
MySQL 5.5,使用InnoDB
答案 0 :(得分:1)
在InnoDB中,主键是群集密钥 - 磁盘上的数据是根据PK的顺序进行物理组织的。这意味着如果你没有使用自动增量或其他一些随着时间的推移增加PK值的东西,你会得到很多随机写入,一旦表的大小大于buffer_pool,这将会破坏你的性能大小
考虑到这一点,md5()不会比插入的复合索引好多少。具有较小的PK有两个原因:PK的大小影响所有二级索引的大小(因为所有二级索引都包含PK)并且使用较小的索引更好(因为您可以一次将更多的值加载到内存中)< / p>