web-dev-qa-db-fra.com

Comment conserver uuid en tant que numéro?

En fonction de la réponse à la question, performances de l'UUID dans MySQL , la personne qui vous répond suggère de stocker l'UUID sous la forme d'un nombre et non d'une chaîne. Je ne suis pas sûr de savoir comment cela peut être fait. Quelqu'un pourrait me suggérer quelque chose? Comment mon Ruby code traite-t-il?)

74
Chamnap

Si je comprends bien, 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é sombre de MySQL. En fait, MySQL utilise plus rapidement le binaire que tout autre outil lorsque des index sont requis.

L'UUID étant de 128 bits et é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, il s'agit de 32 caractères (comme un hachage MD5, avec lequel cela fonctionne également).

Comme 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 interroger 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 une chaîne hexagonale, faites toujours length / 2 Pour la longueur du champ. Donc, pour un sha512, le champ serait BINARY (64) car un codage sha512 est composé de 128 caractères.

106
David Bélanger

Le blog Percona contient un article (qui comprend des points de repère) qui répond à votre question: Stocker l’UUID de manière optimisée .

8
dolmen

Je ne pense pas que ce soit une bonne idée d'utiliser un binaire.

Disons que vous voulez interroger une valeur:

SELECT HEX(field_binary) AS field_binary FROM `test_table`

Si nous retournons plusieurs valeurs, nous appelons la fonction HEX plusieurs fois.

Cependant, le problème principal est le suivant:

SELECT * FROM `test_table`
    where field_binary=UNHEX('110E8400E29B11D4A716446655440000')

Et en utilisant une fonction à l'intérieur de where, ignore simplement l'index.

Également

SELECT * FROM `test_table`
    where field_binary=x'skdsdfk5rtirfdcv@#*#(&#@$9' 

Pourrait conduire à de nombreux problèmes.

0
magallanes