2009-12-22 8 views
2

La base de données sur laquelle je travaille en ce moment a des enregistrements ajoutés et supprimés par dizaines de milliers et à cause de cela il y a des lacunes dans la clé auto-incrémentée des centaines de milliers -créer des chiffres bien dans les milliards.Quand corriger les écarts d'auto-incrémentation dans MYSQL

Ces numéros ne sont jamais stockés pour référencer l'enregistrement individuel mais sont utilisés pour référencer l'enregistrement lors de calculs à la volée.

Y a-t-il une raison pour supprimer ces écarts et réinitialiser le numéro d'auto-incrémentation ou est-ce sans conséquence?

Le champ id est un entier non signé, devrais-je l'augmenter à un grand int non signé? D'après ce que je comprends, en ce moment, si elle frappe 4 294 967 295, elle va se casser.

Répondre

3

La seule raison pour laquelle je m'inquiéterais c'est si vous vous trouvez près de cette limite de 2^32. Si vous n'utilisez pas la colonne comme identifiant de ligne, ne vous inquiétez même pas. Si vous utilisez cette colonne pour n'importe quel type d'information d'identification, alors je passerais la colonne à un GUID ou quelque chose, parce que vous allez avoir un débordement, et vous obtiendrez des valeurs dupliquées . Et ce n'est pas bon.

+0

"les nombres d'auto-incrémentation bien dans les milliards." 2^32 est seulement 4 milliards, donner ou prendre quelques centaines de millions. Peut-être est-il maintenant temps de commencer à s'inquiéter avant qu'il ne soit trop tard. –

1

Je ne sais pas quel est le taux de croissance de votre domaine de l'auto-incrémentation, mais vous devriez calculer simplement quand vous atteindrez la limite de 4294967295.

Si vous vous sentez toujours que vous devez faire quelque chose, vous avez les options suivantes:

  1. réinitialiser le nombre actuel à 1. Pour ce faire, idéalement en laissant tomber la colonne et le recréer. Puisque vous n'utilisez pas ce champ pour l'intégrité référentielle, vous devriez avoir un correctif simple et rapide jusqu'à la prochaine fois ...
  2. Changez le type de données en un BIGINT non signé. Maintenant, vous pouvez aller jusqu'à 18446744073709551615. Mais vous avez besoin de plus d'espace dans le tas pour stocker cette quantité accrue de données, et vous avez seulement reporté votre problème.
  3. Passer d'un auto-incrémentation (INT/BIGINT) à UUID. Ensuite, vous pouvez arrêter de vous soucier des nombres et de la nature de l'infini, mais vous devrez probablement changer tout le code de votre client.

Sur une note séparée, je sens une mauvaise décision ou deux quelque part plus tôt dans la ligne ici.

+0

D'accord, Pourquoi supprimez-vous exactement les enregistrements dans les dizaines de milliers? Vous pourriez vouloir repenser votre normalisation probablement. – MindStalker

+0

La table est utilisée pour stocker des données de recherche. Une fois les calculs terminés, il n'y a plus de raison de conserver les données de calcul et elles sont supprimées. – user103219

+1

Mais merci pour le conseil sur cet UUID, je vais m'y pencher. – user103219