基于问题的答案在MySQL UUID的表现 ,谁的答案建议存储UUID的数量,而不是作为一个字符串的人。 我不太确定它是如何完成的。 任何人都可以建议我什么事? 如何我Ruby代码处理呢?
Answer 1:
如果我理解正确的话,你用你的主列的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个字符。
Answer 2:
该Percona的博客有回复你的问题的文章(包括基准): 存储UUID以优化的方式 。
Answer 3:
我不认为它是个好主意,用二进制。
比方说,你想查询某个值:
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'
莫非会导致很多问题。