79

根据问题的答案,MySQL中的 UUID 性能,回答者建议将 UUID 存储为数字而不是字符串。我不太确定如何做到这一点。任何人都可以给我一些建议吗?我的红宝石代码如何处理?

4

3 回答 3

113

如果我理解正确,您在主列中使用 UUID?人们会说常规(整数)主键会更快,但是还有另一种方法可以使用 MySQL 的阴暗面。事实上,当需要索引时,MySQL 使用二进制比其他任何东西都快。

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

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

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

现在它是 32 个字符(如 MD5 哈希,这也适用)。

由于BINARYMySQL 中的 single 大小为 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 个字符。

于 2012-06-08T14:51:59.737 回答
9

Percona 博客有一篇文章(包括基准测试)回答了您的问题:以优化的方式存储 UUID

于 2015-11-02T20:45:09.377 回答
1

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

假设您要查询某个值:

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' 

可能会导致很多问题。

于 2017-05-29T12:24:27.817 回答