如何将uuid存储为数字?

根据问题的答案, MySQL中的UUID性能 ,答案的人build议将UUID存储为数字而不是string。 我不太确定如何做。 任何人都可以build议我吗? 我的ruby代码如何处理?

如果我理解正确,您在主要列中使用UUID? 人们会说,一个普通的(整数)主键会更快,但是另外一个使用MySQL的黑暗方式。 实际上,在需要索引时,MySQL使用二进制比其他任何东西都快。

由于UUID是128位,并且被写为hex,因此加速和存储UUID非常容易。

首先,在您的编程语言中删除破折号

110E8400-E29B-11D4-A716-446655440000110E8400E29B11D4A716446655440000

现在它是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' 

可能导致许多问题。