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

时间:2011-06-22 19:30:28

标签: mysql indexing guid clustered-index

我们有一个巨大的InnoDB表,其中包含数亿行和3列:GUID,enum,smallint。 所有查找都由GUID完成。

我们正在考虑让GUID成为PK并将其分区为BY KEY。

我们听说使用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。

1 个答案:

答案 0 :(得分:2)

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