В соответствии с ответом на вопрос, производительность UUID в MySQL, тот, кто отвечает, предлагает хранить UUID как число, а не как строку. Я не уверен, как это можно сделать. Кто-нибудь мог мне что-то сказать? Как мой код ruby справляется с этим?
Как хранить uuid в качестве номера?
Ответ 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 символов.
Ответ 2
В блоге Percona есть статья (включающая контрольные показатели), которая отвечает на ваш вопрос: Оптимизировать хранилище UUID.
Ответ 3
Я не думаю, что это хорошая идея использовать двоичный файл.
Скажем, что вы хотите запросить какое-то значение:
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'[email protected]#*#(&#@$9'
Может привести к множеству проблем.