2013-04-20 73 views
8

我有一个UUID字符串,我想用作我的MySQL表主键,UUID是一个32个字符的十六进制字符串(“ - ”字符被剥离)。由于最好在数据库中使用数字列(int)作为主键,所以我想将其转换为整数,但不确定如何处理它。作为MySQL表主键处理大型(UUID)的最佳方式

  1. 由于字符串(即UUID =“a822ff2bff02461db45ddcd10a2de0c2”)的尺寸,我需要分成多“子”这一点。
  2. 由于PHP_INT_MAX大小(最大0xFFFFFFFF),我现在在32位体系结构上运行PHP,因此在PHP内转换它不起作用。我怀疑这会对MySQL造成同样的限制。
  3. 我不喜欢多个主键作为此修复的想法,我宁愿使用字符串表示,即使这不是首选方法。

我可能会考虑这一切都是错误的,并不反对阅读文档,因此无论是示例还是建议阅读作为回应都是可以接受的。

+0

另外要注意的是,这个ID字段将用于连接和选择。 – 2013-04-20 17:04:58

回答

25

对于大多数情况下,最好将UUID/GUID存储为BINARY(16)。看到这些相关的StackOverflow问题:

转换可以(也许应该)在MySQL,而不是PHP所以无论您使用的是32位PHP客户端或64位完成无关紧要(双关语意:P)

+0

这听起来正是我一直在寻找的。 GUID/UUID不是由我生成的,它是从第三方来源提取的。它是独一无二的,可以作为主要关键。 @PaulProgrammer我也非常感谢您的快速回复,我已经为您+1了。感谢您在这些答案中的帮助。 – 2013-04-20 18:06:38

+0

@Hazzit - 你知道将UUID作为字符串绑定到MySQLi中的bind_param方法是否合法,并将其指向二进制(16)字段?我无法确定是否需要先进行任何转换。 – nickdnk 2015-01-29 18:58:36

1

使用字符串类型,而不是整数。如果它解决了一个问题,那么只有更好。

如果您真的关心查询速度,请使用合成(自动增量)主键。您可以在UUID列上放置一个唯一的约束,并且仅使用一次来查找随后用于您的连接的合成密钥等。

+0

我在过去的项目中使用过字符串,我相信(在制作过程中)只会将数百万条记录作为高数字,所以我不认为这是一个很大的性能问题(使用字符串),我不太确定在使用字符串和数字字段时,性能受到影响的规模会有多大。根据规模,我不完全确定合成主键在数百万条记录(比如说1000万条记录)中是有利的。 – 2013-04-20 17:14:10

+0

所以你说的是没有真正的方法来容易地打包/存储这个数字表示,我的选项是字符串和字符串合成自动增量键。 – 2013-04-20 17:16:13

+0

这是一个问题,直到它是一个问题。生产质量数据库(包括mysql)有非常聪明的索引算法来处理字符串查询。如果你现在不关心性能,那么为什么你在原始问题中对抗最大整数大小的墙? – PaulProgrammer 2013-04-20 17:18:35

0

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