Heim > Datenbank > MySQL-Tutorial > So lösen Sie das Problem, wenn die selbsterhöhende MySQL-ID aufgebraucht ist

So lösen Sie das Problem, wenn die selbsterhöhende MySQL-ID aufgebraucht ist

王林
Freigeben: 2023-05-31 16:52:24
nach vorne
1275 Leute haben es durchsucht

mysql hat keine selbsterhöhenden IDs mehr, was soll ich tun?

Ich frage mich, ob Sie als Programmierer bei Vorstellungsgesprächen jemals auf solche Probleme gestoßen sind.

Zhang Gong ist ein Java-Programmierer. Er war kürzlich zu einem Vorstellungsgespräch bei einem Internetunternehmen und der Interviewer stellte ihm eine solche Frage.

Interviewer: „Haben Sie jemals MySQL verwendet? Verwenden Sie die automatisch inkrementierende Primärschlüssel-ID oder UUID als Primärschlüssel-ID Ihrer Datentabelle?“ # Zhang Gong: „Verwenden Sie den automatisch inkrementierenden Primärschlüssel“

Interviewer: „Warum den automatisch inkrementierenden Primärschlüssel?“ Beim Erhöhen des Primärschlüssels werden die Daten sequentiell in der physischen Struktur gespeichert aufgebraucht? die Benachrichtigung"

Heute werden wir darüber sprechen, was zu tun ist, wenn dieser automatisch inkrementierte Primärschlüssel aufgebraucht ist. ?

In MySQL ist der Bereich des Ganzzahltyps int wie folgt: -2^31——2^31-1, also -2147483648—2147483647#🎜 🎜#

Wie im Bild gezeigt:

Zum Beispiel kann die vorzeichenlose Ganzzahl einen Bereich von 0 bis 4294967295 speichern, was ca 4,3 Milliarden. Welche Ausnahmen treten auf, wenn die automatisch inkrementierte ID den Maximalwert erreicht?

Lassen Sie es uns üben.

Erstellen Sie zunächst eine Tabelle tb_user, die nur eine Auto-Inkrement-ID enthält

create table  tb_user(id int unsigned auto_increment primary key) ;
Nach dem Login kopieren

Fügen Sie dann ein Datenelement in diese Tabelle ein:

insert into tb_user values(null);
Nach dem Login kopieren
Nach dem Login kopieren
#🎜 🎜 #Verwenden Sie den Befehl show create table tb_user;, um die Tabellensituation zu überprüfen:

CREATE TABLE `tb_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
Nach dem Login kopieren
So lösen Sie das Problem, wenn die selbsterhöhende MySQL-ID aufgebraucht istWenn Sie vorsichtig sind, werden Sie feststellen, dass AUTO_INCREMENT 2 geworden ist, aber das ist weit vom Maximalwert 4294967295 entfernt. Wenn Sie möchten, dass es 4294967295 wird, müssen wir viele Datensätze einfügen, aber das muss nicht so mühsam sein. Wir können den Anfangswert von AUTO_INCREMENT direkt beim Erstellen der Tabelle deklarieren.

Passen Sie die gerade erstellte Tabellenerstellungsanweisung an. Löschen Sie zuerst die Tabelle, fügen Sie dann beim Erstellen der Tabelle auto_increment = 4294967295

create table tb_user(id int unsigned auto_increment primary key) auto_increment = 4294967295;
Nach dem Login kopieren

hinzu und fügen Sie sie dann in die Tabelle ein Auch ein Datensatz

insert into tb_user values(null);
Nach dem Login kopieren
Nach dem Login kopieren

In ähnlicher Weise verwenden wir den Befehl show, um die Tabellenstruktur der Tabelle tb_user anzuzeigen:

CREATE TABLE `tb_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8
Nach dem Login kopieren

Durch

select * from tb_user
Nach dem Login kopieren

wir Abfrage, dass die ID 4294967295 ist, ist bereits der Maximalwert, wenn

versucht wird, ein Datenelement in die Tabelle einzufügen, wird eine Primärschlüsselkonfliktausnahme gemeldet, wie unten gezeigt.

[SQL]insert into tb_user values(null);
[Err] 1062 - Duplicate entry '4294967295' for key 'PRIMARY'
Nach dem Login kopieren

Dies kann zeigen, dass beim erneuten Einfügen die verwendete Auto-Inkrement-ID immer noch 4294967295 ist und eine Primärschlüsselkonfliktausnahme gemeldet wird.

4294967295, diese Nummer kann die meisten Szenarien bereits bewältigen. Wenn Ihr Dienst häufig Daten einfügt und löscht, besteht immer noch die Gefahr, dass er knapp wird.

Es wird empfohlen, Bigint ohne Vorzeichen zu verwenden, da diese Zahl groß sein wird.

Gibt es dann eine Möglichkeit, das Problem zu lösen? Die Antwort lautet „Ja“, und die Lösung ist sehr einfach. Der Bereich von BigInt ist wie folgt. 🎜🎜#-2^63 -1 bis 2^63-1

-9223372036854775808 9223372036854775807

#🎜 🎜#

Auch wenn jeder Einsatz 10.000 Daten in Sekunden in die Datentabelle einfügen. Schauen wir uns nach 100 Jahren an, wie viele Daten vorhanden sind. Sie können das Problem lösen, indem Sie die Auto-Inkrement-ID auf den Typ BigInt setzen.

Wenn Sie dem Interviewer während des Interviews so antworten.

Sie: „Das ist nicht einfach. Ändern Sie einfach den Typ des automatisch inkrementierten Primärschlüssels in den BigInt-Typ.“

Interviewer: „Sie sind online Wie um den Datentyp der Spalte zu ändern? 🎜#

Sie: „… habe es nie wirklich bedient“

Es ist zu beachten, dass diese Methode nur in myl5.6+ verfügbar ist. Beginnend mit der Unterstützung unterstützt MySQL Online-Änderung von Datenbanktabellen Während des Änderungsprozesses der Tabelle kann bei den meisten Vorgängen die Originaltabelle gelesen und geschrieben werden.

So lösen Sie das Problem, wenn die selbsterhöhende MySQL-ID aufgebraucht ist Gleichzeitige DML-Vorgänge werden für Vorgänge wie das Ändern von Datentypen nicht unterstützt! Mit anderen Worten: Wenn Sie Anweisungen wie alter direkt verwenden, um die Tabellendatenstruktur online zu ändern, kann diese Tabelle keine Aktualisierungsvorgänge (Löschen, Aktualisieren, Einfügen) ausführen. Daher ist es nicht möglich, die Tischstruktur in der Produktionslinie zu ändern.

Gibt es einen besseren Weg? Wir werden dieses Problem später besprechen.

Ich frage mich, ob Sie eine solche Situation bemerkt haben. Obwohl die ID für die automatische Inkrementierung des Primärschlüssels bei 0 beginnt, liegt der Bereich, der jetzt verwendet werden kann, zwischen 0 und 2147483647 Einige IDs in den tatsächlichen Daten Die Werte sind nicht kontinuierlich.

Wenn die eigentliche Produktionstabelle eine einzelne Tabelle mit mehr als Hunderten Millionen Daten enthält und Sie zu diesem Zeitpunkt Daten in die Datentabelle schreiben möchten, wird die Leistung definitiv beeinträchtigt, und Sie müssen dies tun Betrachten Sie schnell Unterdatenbanken und Tabellen.

Wenn die Datenbank in Tabellen unterteilt ist, kann die automatisch inkrementierte ID jeder Tabelle nicht zur globalen eindeutigen Identifizierung der Daten verwendet werden. Um die Umgebung von Sharding-Datenbanken und Sharding-Tabellen zu unterstützen, müssen wir eine Strategie zum Generieren global eindeutiger ID-Nummern bereitstellen.

In der Praxis gibt es also keine Möglichkeit zu warten, bis der automatisch inkrementierte Primärschlüssel aufgebraucht ist.

Eine freundlichere Antwort könnte etwa so lauten

Interviewer: „Dann hat der Auto-Inkrement-Primärschlüssel den Maximalwert erreicht. Was soll ich tun, wenn er aufgebraucht ist?“

Sie: Dieses Problem ist mir noch nie begegnet Da wir int als Primärschlüssel für die automatische Inkrementierung verwenden, wird im Allgemeinen nicht der Maximalwert erreicht. Daher müssen Untertabellen und Unterdatenbanken berücksichtigt werden.

Wenn der Interviewer Sie weiterhin verfolgt und Sie weiterhin nach den wichtigsten Punkten der Unterdatenbank und Untertabelle fragt, können Sie diese gezielt beantworten, was darauf hinweist, dass Sie über umfassende Entwicklungserfahrung in diesem Bereich verfügen, das glaube ich kann diesem Interview noch Punkte hinzufügen.

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem, wenn die selbsterhöhende MySQL-ID aufgebraucht ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage