根据问题的答案,即MySQL中的UUID性能,回答者建议将UUID存储为数字而不是字符串。我不太确定该怎么做。有人可以建议我吗?我的ruby代码如何处理呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
如果我理解正确,那么您在主列中使用的是UUID吗?人们会说,常规(整数)主键会更快,但是还有另一种使用MySQL暗面的方法。实际上,当需要索引时,MySQL使用二进制文件的速度比其他任何东西都要快。
由于UUID为128位,并以十六进制形式编写,因此可以非常轻松地加速和存储UUID。
首先,在您的编程语言中删除破折号
从110E8400-E29B-11D4-A716-446655440000到110E8400E29B11D4A716446655440000。
现在它是32个字符(就像MD5哈希,它也可以使用)。
由于BINARYMySQL中的单个字节为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个字符。来源:stack overflow