php MySQL中UUID作为二进制存储

j13ufse2  于 12个月前  发布在  PHP
关注(0)|答案(3)|浏览(331)

我想创建一个列(不是PK),其值表示为唯一标识符。它不用于加密或安全目的-严格地说是用于标识记录。每次插入新记录时,我都希望生成并存储这个唯一标识符。不确定这是否相关,但我现在有100万条记录,预计2年内将有300万条。我用的是PHP中的Web应用程序。
我最初只是假设我会调用UUID()并将其直接存储为某种char数据类型,但我真的想做一些研究并学习更有效/优化的方法。我在SO上找到了很多很棒的文章,但我对所有的帖子都很难,因为他们中的许多人都有点老了,或者不同意最终让我非常困惑的方法。我想问问有没有更聪明/更有经验的人能帮我一把。
我看到人们在各种帖子上链接到这里,并建议以这种方式实现:https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/
但是阅读了那篇文章之后我不知道该怎么办。是否已订购UUID?我应该把它储存成什么?我想也许那一页有点超出我的理解范围了。我想问是否有人能帮我澄清一些这一点。具体而言:
1.存储二进制数据(表示UUID)的列应该是什么数据类型?
1.我应该使用什么函数来将我的UUID转换为一些二进制值?
1.还有什么可以分享的吗?
非常感谢!

c6ubokkw

c6ubokkw1#

如果调用MySQL的UUID(),则会得到一个大致按时间顺序排列的变体。因此,如果您需要倾向于引用“最近的”记录并忽略“旧的”记录,那么重新排列UUID中的位可以提供更好的“引用局部性”(即更好的性能)。
版本4没有提供这样的功能。
您可以通过my UUID blog中的代码(Q2)将UUID从庞大的36个字符的字符串转换为更紧凑的16字节(Q1)BINARY(16)。该文件讨论了您的问题的其他各个方面。(Q3)
您提供的Percona链接提供了一些基准“证明”的好处。
3M uuid,每个16字节= 48MB。它体积庞大,但不太可能导致严重的问题。尽管如此,我还是建议在可行的情况下避免使用uuid。

laximzn5

laximzn52#

我在最近的一个项目中使用了UUID v4。生成UUID v4的代码可以从这里获取:PHP function to generate v4 UUID
主要区别是我们将其压缩为22字节的大小写敏感格式。ElasticSearch也使用这种方法。
结果值简单地存储为char(22)。

rsaldnfx

rsaldnfx3#

2023更新

一些MySql服务器(虽然在撰写本文时还没有MariaDB)现在已经内置了UUID_TO_BIN()BIN_TO_UUID()函数。虽然MariaDB目前有一个UUID类型,它可能会自动执行这些转换。

相关问题