74 votes

Comment stocker uuid comme nombre?

Basé sur la réponse de la question, l'UUID de la performance dans MySQL, la personne qui répond à suggérer pour stocker les UUID comme un nombre et non pas comme une chaîne de caractères. Je ne suis pas sûr de savoir comment cela peut être fait. Quelqu'un pourrait me suggérer quelque chose? Comment mon code ruby?

107voto

David Bélanger Points 4034

Si je comprends bien, vous êtes en utilisant des Uuid de votre primaire de la colonne? Les gens vont dire que régulièrement (entier) de la clé primaire sera plus rapide , mais il y a une autre façon de l'utilisation de MySQL du côté obscur. En fait, MySQL est plus rapide en utilisant le binaire qu'autre chose quand les indices sont nécessaires.

Depuis l'UUID est de 128 bits et est écrit en hexadécimal, il est très facile de la vitesse et de stocker les UUID.

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

D' 110E8400-E29B-11D4-A716-446655440000 de 110E8400E29B11D4A716446655440000.

Maintenant, il est de 32 caractères (comme un hachage MD5, qui cela fonctionne aussi avec).

Depuis le format binaire nécessite 1 bit pour stocker ce que hexadécimal ne sur 4 bits, nous allons créer un fichier BINAIRE(16).

Vous pouvez insérer à l'aide de:

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

et la requête à l'aide de:

SELECT HEX(FieldBin) AS FieldBin FROM Table

Maintenant, dans votre langage de programmation, ré-insérer les tirets dans les positions 9, 14, 19 et 24 pour correspondre à l'original de votre UUID. Si les positions sont toujours différentes, vous pouvez stocker ces infos 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 quel hex de la chaîne, c'est toujours un length / 2 de la longueur du champ. Donc, pour un sha512, le champ BINARY (64) depuis un sha512 encodage de 128 caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X