Storing MySQL GUID/UUIDs
这是我能想到的将uuid()生成的mysql guid/uuid转换为二进制(16)的最佳方法:
然后将其存储在二进制文件中(16)
这样做有什么我应该知道的意义吗?
- 是的,但当我依赖于应用程序自己的guid生成和未加热和替换(在我的例子中是.net)时,我可以获得边际性能改进。
- @Nawfal,可能是对op的一个间接的回答,但真的希望看到你的评论用例子充实起来。
影响不大。它会稍微减慢查询速度,但您几乎不会注意到。
UNIQUEIDENTIFIER在内部存储为16-byte binary。
如果要将二进制文件加载到客户机中并在那里进行分析,请注意bit order,它可能有其他字符串表示形式,而不是初始的NEWID()。
Oracle的SYS_GUID()函数容易出现此问题,将其转换为字符串会在客户端和服务器上产生不同的结果。
- 我会在评论中加上一些我挖出来的材料。在MySQL中,关于UUID的考虑应该考虑性能和唯一性。虽然稍微老一点,但这里有一个有趣的性能测试:kccoder.com/mysql/uuid-vs-int-insert-performance——这显示了mysql的敏感性,并确保mysql中的"唯一"值。我确信已经有了一些改进,但是如果你有机会的话,应该考虑一下字段的大小、所包含索引的结构等。二进制(16)/char(16)似乎是解决问题的方法。
- 做了一些更深入的研究,我也找到了一个关于"处理二进制索引"的好链接。这里有一个链接:mysqlserverteam.com/storeing-uuid-values-in-mysql-tables-我鼓励任何想转换成mysql的人也来浏览这个博客。我们提出了一些很好的观点来考虑如何"最佳地"存储二进制ID。您的用例可能会根据您如何实现UUID而有所不同,但在排序位和使用计算列满足任何"人类可读"需求方面有很大的不同。
- 当答案的术语和假设似乎仅限于MS SQL,而不是MySQL时,我很困惑为什么会接受这一点。
从MySQL8.0及更高版本,您可以使用uuid_to_bin:
UUID_TO_BIN(string_uuid), UUID_TO_BIN(string_uuid, swap_flag)
Converts a string UUID to a binary UUID and returns the result. (The IS_UUID() function description lists the permitted string UUID formats.) The return binary UUID is a VARBINARY(16) value.
db-fiddle.com演示
- 必须使用第二个参数调用bin_to_uuid(),如果使用该参数调用uuid_to_bin(),则也必须为true。
我将把它散列成一个8字节的整数,并使用一个低冲突、高效的单向散列算法(如humbolhash64a)来存储整数。这样占用的空间更少,可以索引和/或分区。有一个sourceforge项目包含用于mysql的memcached函数(http://forge.mysql.com/projects/project.php)?id=250),可能包括杂音64a,因为Memchached使用它,但我不知道。或者看一下针对mysql的fnv实现:http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/
- 不。UUID有128位。如果您破坏了128位UUID,并且释放了一半的位(8字节=64位),那么就没有必要使用UUID。使用UUID的目的是使生成重复的可能性极低。如果您通过为每个位翻转一个硬币来生成一个8位数字,则可能有256个值。4位数字只有16位。你真的很可能有64位的副本-使用谷歌来找出有多可能。