107 votes

Performances UUID dans MySQL?

Nous envisageons d'utiliser l'UUID de valeurs de clés primaires pour notre base de données MySQL. Les données insérées est généré à partir des dizaines, des centaines, voire des milliers d'ordinateurs à distance et d'être inséré à un taux de 100-40,000 insère par seconde, et nous n'arriverons jamais à faire toutes les mises à jour.

La base de données elle-même sera généralement obtenir à environ 50M des dossiers avant le début de la réforme de données, donc pas un immense base de données, mais pas minuscule non plus. Nous sommes également rabotage à exécuter sur InnoDB, mais nous sommes ouverts à l'évolution que s'il y a un meilleur moteur pour ce que nous faisons.

Nous étions prêts à aller avec Java de Type 4 UUID, mais dans les tests ont été voir un comportement étrange. Pour l'un, nous sommes de stockage comme varchar(36) et je me rends compte maintenant, nous ferions mieux de l'aide binaire(16) - mais comment beaucoup mieux, je ne suis pas sûr.

La plus grande question est: à quel point est-ce à données aléatoires vis de l'index lorsque nous avons 50M de dossiers? Serait-il mieux si nous avons utilisé, par exemple, un type-1 UUID où les bits les plus à gauche ont été datées? Ou peut-être que nous devrions fossé Uuid entièrement et envisager auto_increment primary keys?

Je suis à la recherche des réflexions générales/conseils sur les performances de différents types de Uuid lorsqu'ils sont stockés comme un index de clé primaire dans MySQL. Merci!

91voto

Kat Lim Ruiz Points 381

À mon travail, nous utilisons UUID comme PKs. Ce que je peux vous dire par expérience est de NE PAS les UTILISER comme des PKs (SQL Server).

C'est une de ces choses que quand vous avez moins de 1000 enregistrements;s ok, mais quand vous avez des millions, c'est la pire chose que vous pouvez faire. Pourquoi? Parce que l'UUID ne sont pas séquentielles, de sorte que chaque fois qu'un nouvel enregistrement est inséré MSSQL besoin d'aller chercher à la bonne page pour insérer l'enregistrement, puis insérer l'enregistrement. La vraiment laid conséquence de ceci est que les pages finissent tous dans différentes tailles et ils finissent par fragmenté, nous avons donc maintenant de faire de la fragmentation-périodique.

Lorsque vous utilisez un autoincrement, MSSQL volonté de toujours aller à la dernière page, et vous vous retrouvez avec également de la taille des pages (en théorie) de sorte que la performance de sélectionner les enregistrements est beaucoup mieux (aussi parce que les semelles de ne pas obstruer la table/page depuis longtemps).

Cependant, le gros avantage de l'utilisation de l'UUID comme PKs est que si nous avons des grappes de DBs, il n'y aura pas de conflits lors de la fusion.

Je vous recommande le modèle suivant: 1. PK INT Identité 2. Colonne supplémentaire généré automatiquement que l'UUID.

De cette façon, le processus de fusion est possible (UUID serait votre clé RÉEL, tandis que le PK voudrais juste être quelque chose de temporaire, qui vous donne de bonnes performances).

Espérons que cette aide

40voto

Dancrumb Points 11918

Un UUID est Universellement ID Unique. Il est universellement le cadre que vous devriez être examiné ici.

Avez-vous vraiment besoin de l'Id pour être universellement unique? Si oui, alors Uuid peut être votre seul choix.

Je suggère fortement que si vous n' utilisez Uuid, de les stocker comme un nombre et non pas comme une chaîne de caractères. Si vous avez 50M+ enregistrements, puis de le sauvegarder dans un espace de stockage permettra d'améliorer votre performance (bien que je ne pourrais pas dire combien).

Si vos Identifiants ne doivent pas être universellement unique, alors je ne pense pas que vous pouvez faire beaucoup mieux que de simplement en utilisant auto_increment, qui garantit que les Id sera unique au sein d'un tableau (puisque la valeur s'incrémente à chaque fois)

28voto

Kyle Rozendo Points 15606

Quelque chose à prendre en considération est que Autoincrements sont générés un à la fois et ne peut pas être résolu à l'aide d'une solution parallèle. La lutte pour l'aide Uuid vient finalement à ce que vous voulez atteindre par rapport à ce que vous sacrifier.

Sur les performances, brièvement:

Un UUID comme celle ci-dessus est de 36 caractères, y compris les tirets. Si vous magasin de ce type VARCHAR(36), vous êtes va diminuer de comparer les performances façon spectaculaire. C'est votre principal clé, vous ne voulez pas qu'il soit lent.

À son niveau de bits, un UUID est de 128 bits, ce qui signifie qu'il sera adapté à 16 octets, remarque ce n'est pas très lisible pour l'homme, mais elle va continuer de stockage faible, et est seulement 4 fois plus grand qu'un 32 bits de type int, ou 2 fois plus grand qu'un 64-bit int. Je vais utiliser un VARBINARY(16) Théoriquement, cela peut fonctionner sans un beaucoup de frais généraux.

Je vous recommande de lire les deux posts:

Je pense entre les deux, ils répondre à votre question.

4voto

schworak Points 41

J'ai tendance à éviter les UUID tout simplement parce que c'est une douleur pour stocker et d'une douleur à utiliser comme clé primaire, mais il y a des avantages. Le principal est qu'ils sont UNIQUES.

J'ai l'habitude de régler le problème et éviter l'UUID à l'aide de double de la clé des champs.

COLLECTEUR = UNIQUE ATTRIBUÉ À UNE MACHINE

ID = RECORD RECUEILLIES PAR LE COLLECTEUR (auto_inc champ)

Cette offre moi deux choses. La vitesse de l'auto-inc champs et l'unicité des données stockées dans un emplacement central, une fois recueillies et regroupées. Je sais aussi lors de la navigation sur les données là où elles ont été recueillies, qui est souvent très important pour mes besoins.

J'ai vu beaucoup de cas, tout en traitant avec d'autres ensembles de données pour les clients là où ils ont décidé d'utiliser l'UUID, mais alors encore un domaine où les données ont été collectées, ce qui est vraiment un gaspillage d'efforts. Simplement à l'aide de deux (ou plus si nécessaire) domaines comme la clé de votre aide vraiment.

Je viens de voir trop grand nombre de performances à l'aide de l'UUID. Ils se sentent comme de la triche...

1voto

MindStalker Points 7476

Qu'en est-il des UID fabriqués à la main? Attribuez un ID à chacun des milliers de serveurs et faites de la clé primaire une clé combinée auto-incrémentée, MachineID ???

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