Heim  >  Artikel  >  Datenbank  >  Kennen Sie die Auswirkungen des MySQL-innodb-Selbstinkrementierungs-ID-Fehlers?

Kennen Sie die Auswirkungen des MySQL-innodb-Selbstinkrementierungs-ID-Fehlers?

藏色散人
藏色散人nach vorne
2022-10-18 16:46:032033Durchsuche

All die Jahre mit MySQL waren umsonst. . . Wussten Sie, dass der Fehler bei der automatischen Inkrementierung der MySQL-Innodb-ID 99 % der vorhandenen Systeme betrifft? . .

Kennen Sie die Auswirkungen des MySQL-innodb-Selbstinkrementierungs-ID-Fehlers?

Zuerst reproduzieren wir dieses magische Problem:

Erstellen Sie eine Testtabelle mit einer automatisch inkrementierenden ID, fügen Sie dann 3 Datenelemente ein und löschen Sie das mit der ID = 3.

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
delete from test where id = 3;

Dann starten wir den MySQL Dienst neu.

Fügen Sie erneut einen Datensatz ein und werfen Sie einen Blick auf die zuletzt eingefügte ID. . .

insert into test values ();
select LAST_INSERT_ID();
select * from test;

Das Ergebnis ist, dass nach einem Neustart und erneutem Einfügen des Datensatzes die ID immer noch 3 ist! ! !

Die ursprüngliche Innodb-Auto-Inkrement-ID wird nach dem Neustart des Dienstes automatisch auf die maximale ID + 1 im Datensatz gesetzt.

Dieses Problem kann in einem System, das physisch gelöscht wurde, zu 100 % reproduziert werden.

Gehen Sie davon aus, dass die Auto-Inkrement-ID einer bestimmten Tabelle auch mit anderen Datensätzen verknüpft wird.

In extremen Fällen wird der Datensatz mit der größten ID vor dem Neustart des Dienstes gelöscht. Nach der Wiederherstellung des Dienstes wird der Datensatz eingefügt und dann verknüpft. . .

Das Problem des Datenchaos ist unvorstellbar!

Glücklicherweise wurde dieses Problem in MySQL 8.0 behoben!

Wenn Sie MySQL 5.7 oder eine ältere Version verwenden, machen Sie sich keine Sorgen, die verschiedenen Lösungen sind wie folgt:

* Ändern Sie alle physischen Löschungen im System in weiche Löschungen. Im Allgemeinen ist diese Funktion im Framework integriert und lässt sich sehr bequem ändern und rekonstruieren.

* Aktivieren Sie die Einstellung innodb_autoinc_persistent. Es entsteht ein Leistungsverlust von 1 %, der ignoriert werden kann.

innodb_autoinc_persistent=on
innodb_autoinc_persistent_interval=1

Empfohlenes Lernen: „MySQL-Video-Tutorial

Das obige ist der detaillierte Inhalt vonKennen Sie die Auswirkungen des MySQL-innodb-Selbstinkrementierungs-ID-Fehlers?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yurunsoft.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen