Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker uuid en tant que nombre?

Si j'ai bien compris, vous utilisez des UUID dans votre colonne principale ? Les gens diront qu'une clé primaire régulière (entière) sera plus rapide, mais il existe un autre moyen d'utiliser le côté obscur de MySQL. En fait, MySQL utilise le binaire plus rapidement qu'autre chose lorsque des index sont requis.

Étant donné que l'UUID est de 128 bits et qu'il est écrit en hexadécimal, il est très facile d'accélérer et de stocker l'UUID.

Tout d'abord, dans votre langage de programmation, supprimez les tirets

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

Maintenant, c'est 32 caractères (comme un hachage MD5, avec lequel cela fonctionne également).

Depuis un seul BINARY dans MySQL a une taille de 8 bits, BINARY(16) est la taille d'un UUID (8*16 =128).

Vous pouvez insérer en utilisant :

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

et interrogez en utilisant :

SELECT HEX(FieldBin) AS FieldBin FROM Table

Maintenant, dans votre langage de programmation, réinsérez les tirets aux positions 9, 14, 19 et 24 pour correspondre à votre UUID d'origine. Si les positions sont toujours différentes, vous pouvez stocker ces informations dans un deuxième champ.

Exemple complet :

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`

Si vous souhaitez utiliser cette technique avec n'importe quelle chaîne hexadécimale, faites toujours length / 2 pour la longueur du champ. Donc pour un sha512, le champ serait BINARY (64) puisqu'un encodage sha512 fait 128 caractères.