Basé sur la réponse à la question, UUID performance in MySQL, la personne qui répond suggère de stocker UUID comme un nombre et non comme une chaîne. Je ne suis pas sûr de comment cela peut être fait. Quelqu'un pourrait me suggérer quelque chose? Comment mon code ruby gère cela?Comment stocker uuid comme numéro?
Répondre
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 y a une autre façon d'utiliser le côté obscur de MySQL. En fait, MySQL utilise plus rapidement les binaires que toute 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.
D'abord, dans votre langage de programmation supprimer les tirets
De 110E8400-E29B-11D4-A716-446655440000
-110E8400E29B11D4A716446655440000
.
Maintenant c'est 32 caractères (comme un hachage MD5, avec lequel cela fonctionne aussi).
Puisqu'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 à l'aide:
INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))
et requête en utilisant:
SELECT HEX(FieldBin) AS FieldBin FROM Table
Maintenant, dans votre langage de programmation, ré-insérer 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 cette information 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, toujours faire length/2
pour la longueur du champ. Donc pour un sha512, le champ serait BINARY (64)
car un encodage sha512 fait 128 caractères.
utiliser la fonction unhex rendre le résultat illisible. – Chamnap
@Chamnap La fonction UNHEX convertira HEX en BINARY dans votre base de données. Vous pouvez ensuite utiliser des index dessus sans problème et avec un gain de performance (oui oui!). Vous lisez ensuite les données avec la fonction 'HEX' comme dans mon exemple. Donc non, vous ne pouvez pas lire le résultat de 'UNHEX', mais vous pouvez utiliser' HEX'. Rappelez-vous que l'ordinateur est fait de binaire, toujours plus rapide. –
@Chamnap Disons que vous avez 10 000 lignes dans votre base de données et qu'elles ont été ajoutées en utilisant la fonction UNHEX et que vous voulez rechercher l'UUID '110E8400-E29B-11D4-A716-446655440000'. Faites simplement quelque chose comme: 'SELECT * FROM test_table WHERE field_binary COMME CONCAT ("% ", UNHEX ('110E8400E29B11D4A716446655440000'),"% ")' –
Le blog Percona a un article (qui inclut des benchmarks) qui répond à votre question: Store UUID in an optimized way.
Je ne pense pas que ce soit une bonne idée d'utiliser un binaire.
Disons que vous voulez interroger une certaine valeur:
SELECT HEX(field_binary) AS field_binary FROM `test_table`
Si nous revenions plusieurs valeurs alors nous appelons la fonction HEX plusieurs fois.
Cependant, le principal problème est la suivante:
SELECT * FROM `test_table`
where field_binary=UNHEX('110E8400E29B11D4A716446655440000')
Et en utilisant une fonction à l'intérieur du où, ne tient pas simplement l'indice.
également
SELECT * FROM `test_table`
where field_binary=x'[email protected]#*#(&#@$9'
pourrait conduit à de nombreux problèmes.
- 1. Laravel 4 utilisant UUID comme clé primaire
- 2. Comment utiliser UUID comme clé primaire pour Hibernate Entity?
- 3. Convertir Java UUID à un androïde UUID
- 4. Comment trouver UUID en programmant sur iphone?
- 5. Cassandra - Comment insérer un UUID
- 6. Rails + UUID + Désireuse chargement
- 7. Devrais-je utiliser node-uuid ou uuid?
- 8. Écrire UUID comme texte dans cassandra avec node.js
- 9. Comment créer correctement un nouvel UUID binaire BSON à stocker sur une base de données Mongo?
- 10. comment obtenir UUID en j2me?
- 11. UUID comme valeur par défaut dans le modèle Django
- 12. Cela fonctionnerait-il comme un générateur UUID en PHP?
- 13. Time UUID type dans pycassa
- 14. Comment stocker uuid sous forme binaire en utilisant hibernate JPA 2
- 15. Regex pour le format correspondant comme Numéro Lettre, Numéro Numéro Lettre, Numéro Numéro Numéro Lettre
- 16. UUID dans OpenOffice.org Base
- 17. Stocker setInterval comme propriété d'objet
- 18. Remplacer toutes les chaînes UUID avec de nouvelles chaînes UUID
- 19. Comment stocker un numéro de version dans une bibliothèque statique?
- 20. Numéro de série de l'application Android et comment le stocker?
- 21. Astyanax récupérer par UUID
- 22. Comment générer un UUID CouchDB avec Node.js?
- 23. Comment utiliser les UUID dans SQLAlchemy?
- 24. iPhone - Stocker une double valeur dans un NSDictionary avec seulement 7 décimales comme type de numéro
- 25. Comment définir UUID 128 bits dans arduino
- 26. Comment générer un UUID de 24 caractères?
- 27. MD5 uuid collision?
- 28. stocker des nombres comme varchar
- 29. Sequelize: set new uuid
- 30. Object to GUID/UUID
Les problèmes de performances surviennent uniquement lorsque vous utilisez l'UUID comme clé primaire, car les UUID ne sont pas des clés primaires très efficaces. Pourquoi avez-vous besoin d'UUID? Pourriez-vous conserver les UUID et simplement utiliser un auto-incrément comme clé primaire? –
@ThomSmith Re "Les UUID ne sont pas des clés primaires très efficaces" ... tiens à citer une source qui explique pourquoi? – Pacerier
C'est une donnée plus importante, et il faudra généralement plus d'instructions pour comparer. Ce n'est pas séquentiel, donc l'overhead de l'indexation est juste un peu plus élevé. Et, bien sûr, si vous le stockez comme une chaîne au lieu d'un numéro de 128 bits, comme le OP semble le faire, la situation s'aggrave. Ce n'est pas une clé terrible, mais je ne l'utiliserais pas à moins qu'il y ait une raison externe de le faire. –