根据问题的答案,即MySQL中的UUID性能,回答者建议将UUID存储为数字而不是字符串。我不太确定该怎么做。有人可以建议我吗?我的ruby代码如何处理呢?
根据问题的答案,即MySQL中的UUID性能,回答者建议将UUID存储为数字而不是字符串。我不太确定该怎么做。有人可以建议我吗?我的ruby代码如何处理呢?
Answers:
如果我理解正确,那么您在主列中使用的是UUID吗?人们会说,常规(整数)主键会更快,但是还有另一种使用MySQL暗面的方法。实际上,当需要索引时,MySQL使用二进制文件的速度比其他任何东西都要快。
由于UUID为128位,并以十六进制形式编写,因此可以非常轻松地加速和存储UUID。
首先,在您的编程语言中删除破折号
从110E8400-E29B-11D4-A716-446655440000
到110E8400E29B11D4A716446655440000
。
现在它是32个字符(就像MD5哈希,它也可以使用)。
由于BINARY
MySQL中的单个文件的大小为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个字符。
110E8400-E29B-11D4-A716-446655440000
。就像这样:SELECT * FROM test_table WHERE field_binary LIKE CONCAT("%", UNHEX('110E8400E29B11D4A716446655440000'), "%")
WHERE Field = UNHEX('110E8400E29B11D4A716446655440000')
。除了WHERE Field = 3
使用十六进制字符串(搜索,插入,在何处,更新,删除等)外,您还可以使用UNHEX来封装字段,而要从MySQL中读取时,可以使用HEX来封装字段(选择)。
Percona博客上有一篇文章(包括基准测试)可以回答您的问题:以优化的方式存储UUID。
我认为使用二进制不是一个好主意。
假设您要查询一些值:
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'
可能导致很多问题。