Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar uuid como número?


Se bem entendi, você está usando UUIDs em sua coluna primária? As pessoas dirão que uma chave primária regular (inteira) será mais rápida, mas há outra maneira de usar o lado escuro do MySQL. Na verdade, o MySQL é mais rápido usando binário do que qualquer outra coisa quando os índices são necessários.

Como o UUID é de 128 bits e é escrito como hexadecimal, é muito fácil acelerar e armazenar o UUID.

Primeiro, em sua linguagem de programação, remova os traços

De 110E8400-E29B-11D4-A716-446655440000 para 110E8400E29B11D4A716446655440000 .

Agora são 32 caracteres (como um hash MD5, com o qual isso também funciona).

Como um único BINARY no MySQL tem 8 bits de tamanho, BINARY(16) é o tamanho de um UUID (8*16 =128).

Você pode inserir usando:

INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))

e consulte usando:

SELECT HEX(FieldBin) AS FieldBin FROM Table

Agora, em sua linguagem de programação, reinsira os traços nas posições 9, 14, 19 e 24 para corresponder ao seu UUID original. Se as posições forem sempre diferentes, você poderá armazenar essa informação em um segundo campo.

Exemplo completo:
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`

Se você quiser usar esta técnica com qualquer string hexadecimal, sempre faça length / 2 para o comprimento do campo. Então, para um sha512, o campo seria BINARY (64) uma vez que uma codificação sha512 tem 128 caracteres.