Meilleure façon de traiter de gros (UUID) en tant que clé primaire de la table MySQL
J'ai un UUID de la chaîne que je veux utiliser comme mes tables MySQL clé primaire, l'UUID est de 32 caractères hexadécimaux de chaîne (après '-' les caractères sont supprimés). En raison du fait qu'il est préférable d'utiliser une colonne numérique (int) comme clé primaire dans une base de données, je voudrais le convertir à un nombre entier, mais pas sûr de la meilleure façon de le gérer.
- En raison de la taille de la chaîne (c'est à dire. uuid='a822ff2bff02461db45ddcd10a2de0c2'), ai-je besoin de briser ce en plusieurs sous-chaînes'.
- Je suis en cours d'exécution PHP sur une architecture 32 bits pour le moment donc de le convertir en PHP ne fonctionnera pas en raison de PHP_INT_MAX taille (max 0xFFFFFFFF). Et je soupçonne que ce serait la même restriction pour MySQL.
- Je n'aime pas l'idée de plusieurs clés primaires comme un correctif pour cela, je préfère utiliser une représentation de chaîne, même si ce n'est pas la méthode préférée.
J'ai peut-être penser à propos de ce tout faux, et ne suis pas contre la lecture de la documentation, des exemples ou des suggestions de lecture comme une réponse serait acceptable.
Également à noter, ce champ id serait utilisé pour les jointures et les sélectionne.
OriginalL'auteur Aaron Murray | 2013-04-20
Vous devez vous connecter pour publier un commentaire.
Pour la plupart des cas, il est préférable de stocker les Uuid/Guid comme
BINARY(16)
. Consultez les StackOverflow questions:La conversion peut (et devrait) être fait dans MySQL au lieu de PHP donc si vous êtes en utilisant 32 bits PHP client ou 64bits n'a pas d'importance un peu (jeu de mot :P)
savez-vous si il est légal de lier l'UUID comme une chaîne à une bind_param méthode en MySQLi et il suffit de pointer vers un fichier binaire(16) domaine? Je vais avoir du mal à déterminer si j'ai besoin de faire des conversions en premier.
Upvoted aussi parce que le jeu de mots 🙂
OriginalL'auteur Hazzit
Utiliser un type de chaîne, pas un entier. Mieux, c'est que meilleure si elle résout un problème.
Si vous êtes vraiment préoccupé de recherche de vitesse, l'utilisation d'un synthétique (auto increment) clé primaire. Vous pouvez placer une contrainte unique sur l'UUID de la colonne, et de l'utiliser qu'une seule fois pour rechercher le synthétique de la clé qui est utilisé par la suite pour vos jointures etc.
Donc, ce que vous dites il n'y a pas de véritable moyen de pack / store ce dans une représentation numérique facilement, mes options sont des chaînes de caractères et les chaînes de caractères avec la synthèse de l'auto-incrémentation des clés.
Ce n'est pas un problème jusqu'à il ya un problème. La qualité de la Production de bases de données (mysql inclus) ont très intelligent indexation des algorithmes de manipulation de chaîne de requêtes. Si vous n'êtes pas préoccupé par la performance, alors pourquoi êtes-vous bashing votre tête contre le max entier de la taille du mur à votre question de départ?
Bien sûr, vous pouvez emballer / store cela comme un entier (probablement par l'utilisation de plusieurs champ PKs, qui vous dit que vous n'aimez pas (je ne sais pas pourquoi)), mais pourquoi aller à la peine, et en subir les frais de maintenance d'aller de l'avant si ce n'est pas de résoudre un problème réel?
J'aime la réponse de @Hazzit donne de meilleurs. L'utiliser.
OriginalL'auteur PaulProgrammer
Cela dépend du moteur de stockage aussi. TokuDB doit gérer tous ces problèmes.
OriginalL'auteur giuseppe