automatisches Inkrementieren der primären Lücken beim Zählen

8

Ich habe eine Tabelle mit Autoinkrement-Primärschlüssel. Diese Tabelle soll Millionen von Datensätzen speichern und ich muss vorerst nichts löschen. Das Problem ist, dass beim Einfügen neuer Zeilen aufgrund eines Fehlers die Autoinkrementtaste einige Lücken in den Autoinkrement-IDs zurücklässt. Beispielsweise ist die nächste ID nach 5 die 8 und lässt die Lücke von 6 und 7 Ergebnis davon ist, wenn ich die Zeilen zähle, ergibt es 28000, aber die maximale ID ist 58000. Was kann der Grund sein? Ich lösche nichts. Und wie kann ich dieses Problem beheben?

P.S. Ich verwende Einfügen ignorieren beim Einfügen von Datensätzen, so dass es keinen Fehler gibt, wenn ich versuche, doppelten Eintrag in eindeutige Spalte einzufügen.

    
Sourabh 16.05.2013, 08:38
quelle

4 Antworten

10

Dies ist per Entwurf und wird immer passieren.

Warum?

Nehmen wir 2 überlappende Transaktionen, die INSERTs ausführen

  • Transaktion 1 führt INSERT durch, erhält den Wert (sagen wir 42), funktioniert mehr
  • Transaktion 2 führt einen INSERT aus, erhält den Wert 43, mehr Arbeit

Dann

  • Transaktion 1 schlägt fehl. Rollt zurück. 42 bleibt ungenutzt
  • Transaktion 2 wird mit 43
  • abgeschlossen

Wenn aufeinanderfolgende Werte garantiert wären, müsste jede Transaktion nacheinander erfolgen. Nicht sehr skalierbar.

Siehe auch Führen eingefügte Datensätze immer zusammenhängende Identitätswerte aus (SQL Server aber das gleiche Prinzip gilt)

    
gbn 16.05.2013, 08:40
quelle
2

Dies ist ein Problem in InnoDB, der Speicher-Engine von mySQL.

Es ist wirklich kein Problem wie

Wenn Sie die Dokumente überprüfen Ссылка

Im Grunde sagt InnoDB eine spezielle Tabelle, um die automatischen Inkremente beim Start zu machen

Und die Abfrage, die es verwendet, ist so etwas wie

%Vor%

Dies verbessert die Parallelität, ohne dass dies Auswirkungen auf Ihre Daten hat.

Um dies nicht zu verwenden, verwenden Sie MyISAM anstelle von InnoDB als Speichermodul

    
cjds 16.05.2013 08:47
quelle
2

Sie können einen Trigger erstellen, um das automatische Inkrement wie folgt zu behandeln:

%Vor%     
Mackraken 22.01.2016 13:53
quelle
1

Vielleicht (ich habe das nicht getestet) ist eine Lösung, innodb_autoinc_lock_mode auf 0 zu setzen. Laut Ссылка könnte dies die Dinge etwas langsamer machen (wenn Sie führen Einsätze von mehreren Zeilen in einer einzigen Abfrage durch, sollten aber Lücken entfernen.

    
qbolec 23.02.2016 16:26
quelle

Tags und Links