处理大量(UUID)作为MySQL表主键的最佳方法

14

我有一个UUID字符串,希望将其作为MySQL表的主键使用。该UUID是一个32位十六进制字符串(去掉“-”字符后)。由于最好在数据库中使用数字列(int)作为主键,因此我希望将其转换为整数,但不确定处理的最佳方式。

  1. 由于字符串的大小(例如 uuid='a822ff2bff02461db45ddcd10a2de0c2'),我需要将其分成多个“子字符串”吗。
  2. 目前我正在32位架构上运行PHP,因此在PHP中进行转换将无法工作,因为PHP_INT_MAX尺寸限制为最大0xFFFFFFFF。而且我怀疑MySQL也会有同样的限制。
  3. 我不喜欢使用多个主键来修复这个问题,我宁愿使用字符串表示,即使这不是优选方法。

也许我的想法都错了,我不反对阅读文档,所以可以回复示例或建议阅读材料。


另外需要注意的是,此id字段将用于连接和选择操作。 - Aaron Murray
3个回答

35

对于大多数情况,最好将UUID / GUID存储为BINARY(16)。请参阅以下相关的StackOverflow问题:

该转换可以(并且可能应该)在MySQL中进行,而不是在PHP中进行,因此无论您使用32位PHP客户端还是64位,都没有关系(这里有点小笑话:P)。


这听起来正是我所寻找的。GUID/UUID并非由我生成,而是从第三方来源获取。它是唯一的,并且作为主键很好用。@PaulProgrammer,我也很感激您的迅速回复,我已经给你们两个点赞了。感谢您在这些答案中提供的帮助。 - Aaron Murray
@Hazzit - 你知不知道将UUID作为字符串绑定到MySQLi的bind_param方法并将其指向二进制(16)字段是否合法?我无法确定是否需要先进行任何转换。 - nickdnk

1
使用字符串类型,而不是整数类型。只有当它解决了问题时,更好才是更好。
如果你真的关心查找速度,可以使用合成(自动增量)主键。你可以在UUID列上放置唯一约束,并仅使用它一次来查找合成键,随后用于连接等操作。

我在以前的项目中使用过字符串,并且我相信(在生产环境中)只会涉及几百万条记录,因此我认为这不是一个大的性能问题(使用字符串)。我不确定在什么大小的情况下,使用字符串与数字字段相比会带来性能损失。根据数据量的大小,我不确定在数百万条记录(最多10百万条)的情况下,使用合成主键是否有优势。 - Aaron Murray
所以你的意思是没有真正简单的方式来将其打包/存储为数字表示,我的选择是字符串和带有合成自增键的字符串。 - Aaron Murray
直到问题出现才是问题。生产质量的数据库(包括mysql)具有非常聪明的索引算法来处理字符串查询。如果您还不关心性能,那么为什么要在原始问题中撞击最大整数大小的墙壁呢? - PaulProgrammer
当然,你可以将其打包/存储为整数(可能使用多个字段PK),但为什么要费这个劲,并在以后承担维护开销,如果它不能解决实际问题呢? - PaulProgrammer
我更喜欢@Hazzit给出的答案。使用那个。 - PaulProgrammer
显示剩余2条评论

-1

这也取决于存储引擎。TokuDB 应该能够处理所有这些问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接