MySQL中的UUID存储为二进制

时间:2016-08-27 19:51:24

标签: php mysql database database-design

我想创建一个列(不是PK),其值表示为唯一标识符。它不用于加密或安全目的 - 严格用于标识记录。每次插入新记录时,我都想生成并存储此唯一标识符。不确定这是否相关,但我现在有100万条记录,预计2年内会有300万条记录。我正在使用PHP中的Web应用程序。

我最初假设我调用UUID()并将其直接存储为某种char数据类型,但我真的想做一些研究并学习更有效/优化的方法。我在这里发现了很多很棒的文章,但我对所有帖子都很难,因为他们中的许多都有点老了,或者对最终让我很困惑的方法持不同意见。我想问一下,更聪明/有经验的人是否可以帮助我。

我看到大家在这里链接各种帖子并建议以这种方式实现: https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

但是在阅读那篇文章之后,我很难完全知道该怎么做。订购UUID?我应该将它存储为什么?我想也许那个特定的页面在我脑海里有点儿。我想问一下是否有人可以帮我澄清其中的一些内容。具体做法是:

  1. 我的列应该用于存储二进制数据(代表我的UUID)的数据类型是什么?
  2. 我应该使用什么函数将UUID转换为某个二进制值?
  3. 有人可以分享的更多进展或提示吗?
  4. 非常感谢!

2 个答案:

答案 0 :(得分:2)

如果你打电话给MySQL UUID(),你会得到一个大致按时间顺序排列的变体。所以,如果你需要倾向于引用"最近"记录并忽略" old"记录,然后重新排列UUID中的位可以提供更好的参考位置" (即更好的表现)。

版本4不提供此类。

您可以在my UUID blog中将UUID从庞大的36个字符的字符串转换为更紧凑的16字节(Q1)BINARY(16)代码(Q2)。该文档讨论了您问题的其他各个方面。 (Q3)

您提供的Percona链接提供了一些基准测试和证明'好处。

3M uuids每个16字节= 48MB。它体积庞大,但不太可能造成严重问题。不过,我建议在适当的时候避免使用uuids。

答案 1 :(得分:0)

我在最近的一个项目中使用了UUID v4。生成UUID v4的代码可以在这里找到:PHP function to generate v4 UUID

主要区别在于我们将其压缩为22字节区分大小写的格式。 ElasticSearch也使用这种方法。

结果值只存储为char(22)。