Как хранить uuid в качестве номера?

В соответствии с ответом на вопрос, производительность UUID в MySQL, тот, кто отвечает, предлагает хранить UUID как число, а не как строку. Я не уверен, как это можно сделать. Кто-нибудь мог мне что-то сказать? Как мой код ruby ​​справляется с этим?

Ответ 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 символов.

Ответ 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' 

Может привести к множеству проблем.