2009-02-13 34 views
29

这是我能想出的UUID()产生一个MySQL GUID/UUID转换为二进制的最佳方法(16):存储MySQL的GUID/UUID的

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

然后将其存储在一个BINARY(16)

这样做我应该知道有什么影响吗?

+0

是的,但是当我依赖于应用程序自己的guid生成和unhexing并替换(在我的情况下,.NET)时,我可以获得边际性能改进 – nawfal 2012-06-28 00:08:53

+0

@nawfal,may对OP来说是一个倾斜的答案,但是真的希望看到你的评论充满了实例。 – 2017-03-06 19:27:50

回答

8

没有太多的影响。它会减慢查询的速度,但您几乎不会注意到它。

UNIQUEIDENTIFIER内部无论如何存储为​​。

如果您打算将二进制文件加载到客户端并解析它,请注意bit order,它可能具有比初始NEWID()更多的其他字符串表示形式。

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

+0

我会添加到评论我挖了一些材料。在MySQL中关于UUID的考虑应该考虑性能以及唯一性。虽然稍微老一点,但一个有趣的性能测试在这里:http://kccoder.com/mysql/uuid-vs-int-insert-performance/ - 这表明了MySQL的敏感点,并确保MySQL中的“UNIQUE”值。我相信有一些改进,但是如果你有机会,应该考虑到领域的大小,包含的索引的结构等。 BINARY(16)/ CHAR(16)似乎是要走的路。 – 2016-02-04 10:47:31

-4

我将散列成一个8字节的整数,并且使用低碰撞的高效率的单向散列算法等MurmurHash64A存储整数。这使用了很少的空间,并且可以进行索引和/或分区。有一个SourceForge项目,包括MemSQL的MemSQL功能(http://forge.mysql.com/projects/project.php?id=250),可能包括MurmurHash64A,因为Memchached使用它,但我不知道。或者看看这个针对mySQL的FNV的实现:http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/