存储MySQL GUID/UUIDs

33

这是我能想到的将由UUID()生成的MySQL GUID/UUID转换为binary(16)的最佳方法:

UNHEX(REPLACE(UUID(),'-',''))

然后将其存储在BINARY(16)中。

这种方法有什么影响是我需要知道的吗?


是的,但是当我依赖于应用程序自己的GUID生成和解码以及替换(在我的情况下,是.NET)时,我可以获得较小的性能提升。 - nawfal
@nawfal,也许这是对OP的一个间接回答,但我真的很想看到您的评论能够用例子详细说明。 - Marc L.
2个回答

9

从MySQL 8.0及以上版本开始,您可以使用UUID_TO_BIN函数:

UUID_TO_BIN(string_uuid),UUID_TO_BIN(string_uuid, swap_flag)

将字符串UUID转换为二进制UUID并返回结果。(IS_UUID()函数描述了允许的字符串UUID格式。)返回的二进制UUID是一个VARBINARY(16)值。

CREATE TABLE t (id binary(16) PRIMARY KEY);
 
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));

SELECT *, BIN_TO_UUID(id) FROM t;

DB-Fiddle.com演示


2
如果使用UUID_TO_BIN()函数,则必须将BIN_TO_UUID()函数的第二个参数也设置为TRUE。请注意。 - Mike Shiyan

8

影响不大。它会稍微减慢查询速度,但你几乎不会注意到它。

UNIQUEIDENTIFIER 内部存储为 16字节二进制

如果你要将二进制加载到客户端并在那里解析它,请注意 位顺序,它可能有其他字符串表示形式而不是初始的 NEWID()

OracleSYS_GUID() 函数容易出现这个问题,在客户端和服务器上将其转换为字符串会得到不同的结果。


我想在评论中添加一些我挖掘出来的材料。在考虑MySQL中UUID时,应该考虑性能和唯一性。虽然稍微有点老,但这里有一个有趣的性能测试:http://kccoder.com/mysql/uuid-vs-int-insert-performance/ - 这显示了MySQL中确保“UNIQUE”值的敏感点。我相信已经有所改进,但如果有机会,应该考虑字段的大小、包含索引的结构等。BINARY(16) / CHAR(16)似乎是正确的选择。 - Zack Jannsen
通过更深入的研究,我还找到了一个关于“处理二进制索引”的好链接。这是链接:http://mysqlserverteam.com/storing-uuid-values-in-mysql-tables/ - 我鼓励任何考虑转换到MySQL的人也查看这篇博客。它提出了一些很好的观点,可以考虑如何“最优地”存储二进制ID。根据您实现UUID的方式,您的用例可能会有所不同,但在排序位和为任何“可读性”需求使用计算列方面提出了很好的观点。 - Zack Jannsen
2
我很困惑为什么这个答案被接受了,因为它的术语和假设似乎只适用于MS SQL,而不是MySQL。 - Marc L.

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