2

假设我有一个包含 3 个 varchar(256) 列的复合主键的表:A、B 和 C。B 上还有一个索引,复合键充当 A 上的索引。这张表有数百万rows and 有很多INSERTSand SELECTS,但没有UPDATES(除了使用ON DUPLICATE KEY UPDATEwith INSERTS)。

如果我将此表更改为具有 md5(A,B,C) 的单列 char(32) 主键(以及 A 上的索引和 B 上的索引),这种设置对于 INSERTS 会更有效吗?碰撞的可能性不会打扰我。

MySQL 5.5,使用 InnoDB

4

1 回答 1

1

在 InnoDB 中,主键是一个集群键——磁盘上的数据是根据 PK 的顺序物理组织的。这意味着,如果您不使用自动增量或其他会随着时间增加 PK 值的东西,您将获得大量随机写入,一旦表的大小大于 buffer_pool,这将影响您的性能尺寸。

考虑到这一点, md5() 不会比插入的复合索引好多少。PK 较小有两个好处:PK 的大小会影响所有二级索引的大小(因为所有二级索引都包含 PK)和使用较小的索引更好(因为您可以一次将更多值加载到内存中)

于 2013-07-06T20:12:51.380 回答