如何将uuid存储为数字?
根据问题的答案, MySQL中的UUID性能 ,答案的人build议将UUID存储为数字而不是string。 我不太确定如何做。 任何人都可以build议我吗? 我的ruby代码如何处理?
如果我理解正确,您在主要列中使用UUID? 人们会说,一个普通的(整数)主键会更快,但是另外一个使用MySQL的黑暗方式。 实际上,在需要索引时,MySQL使用二进制比其他任何东西都快。
由于UUID是128位,并且被写为hex,因此加速和存储UUID非常容易。
首先,在您的编程语言中删除破折号
从110E8400-E29B-11D4-A716-446655440000
到110E8400E29B11D4A716446655440000
。
现在它是32个字符(就像MD5哈希,这也适用)。
由于MySQL中的单个BINARY
大小为8位, BINARY(16)
是UUID(8 * 16 = 128)的大小。
你可以插入使用:
INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))
和查询使用:
SELECT HEX(FieldBin) AS FieldBin FROM Table
现在用你的编程语言,在9,14,19和24的位置重新插入破折号以匹配你原来的UUID。 如果职位总是不同的话,你可以在第二个领域存储这些信息。
完整的例子:
CREATE TABLE `test_table` ( `field_binary` BINARY( 16 ) NULL , PRIMARY KEY ( `field_binary` ) ) ENGINE = INNODB ; INSERT INTO `test_table` ( `field_binary` ) VALUES ( UNHEX( '110E8400E29B11D4A716446655440000' ) ); SELECT HEX(field_binary) AS field_binary FROM `test_table`
如果你想用任何hexstring来使用这种技术,对于字段长度,总是做length / 2
。 所以对于sha512,由于sha512编码长度为128个字符,因此该字段将是BINARY (64)
。
Percona博客有一篇文章(包括基准)回答你的问题: 以优化的方式存储UUID 。
我不认为使用二进制文件是一个好主意。
假设你想查询一些值:
SELECT HEX(field_binary) AS field_binary FROM `test_table`
如果我们返回几个值,那么我们几次调用HEX函数。
但是,主要的问题是下一个:
SELECT * FROM `test_table` where field_binary=UNHEX('110E8400E29B11D4A716446655440000')
而使用里面的函数,只是忽略索引。
也
SELECT * FROM `test_table` where field_binary=x'skdsdfk5rtirfdcv@#*#(&#@$9'
可能导致许多问题。