如何将uuid存储为数字?

时间:2012-06-08 13:54:06

标签: mysql uuid

根据问题的答案UUID performance in MySQL,回答的人建议将UUID存储为数字而不是字符串。我不太确定如何做到这一点。有人可以建议我吗?我的ruby代码如何解决这个问题?

3 个答案:

答案 0 :(得分:106)

如果我理解正确,您在主列中使用UUID?人们会说普通(整数)主键会更快,但是使用MySQL的另一种方法是黑暗的。实际上,当需要索引时,MySQL使用二进制文件比使用二进制文件更快。

由于UUID是128位且写为十六进制,因此加速和存储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`

如果要将此技术用于任何十六进制字符串,请始终对字段长度length / 2。因此对于sha512,字段为BINARY (64),因为sha512编码长度为128个字符。

答案 1 :(得分:8)

Percona博客有一篇文章(包括基准)回复了您的问题:Store UUID in an optimized way

答案 2 :(得分:0)

我认为使用二进制文件不是一个好主意。

让我们说你想查询一些值:

SELECT HEX(field_binary) AS field_binary FROM `test_table`

如果我们返回几个值,那么我们会多次调用HEX函数。

然而,主要问题是下一个问题:

SELECT * FROM `test_table`
    where field_binary=UNHEX('110E8400E29B11D4A716446655440000')

在where中使用函数,只需忽略索引。

另外

SELECT * FROM `test_table`
    where field_binary=x'skdsdfk5rtirfdcv@#*#(&#@$9' 

可能导致许多问题。