在大分区MySQL表中使用GUID作为PK

Phi*_*tor 6 mysql indexing guid clustered-index

我们有一个巨大的InnoDB表,有数亿行,只有3列:GUID,enum,smallint.所有查找都由GUID完成.

我们正在考虑将GUID作为PK并将其按BY键分区.

我们听说使用GUID作为PK是坏的,因为它的随机分布以及PK创建聚簇索引的事实.因此,以GUID的随机顺序存储行会增加碎片和页面拆分.

使用GUID作为PK的替代方法是创建代理自动增量密钥,并将其用作PK.但是,如果我们想通过GUID对表进行分区,那么GUID也必须是PK的一部分.此外,由于所有查询都是通过GUID完成的,因此我们需要一个额外的GUID索引.该索引实际上映射GUID-> PK,而如果我们使用GUID作为PK - 表本身映射GUID-> enum + small int?

所以我的问题是我们是否通过添加auto-inc PK并获得额外的GUID索引来获得任何收益?

谢谢,Philopator.

Jer*_*wdy 2

在 InnoDB 中使用 GUID 作为 PK 的问题不仅仅是 GUID 分布是随机的。InnoDB中的记录是按主键顺序存储的。这意味着在您所讨论的表设计中,InnoDB 将不断移动数据以对 GUID 进行排序。您应该使用将 GUID 映射到 int 或 bigint 的转换表,并将其用作 PK。