Die Effizienz des Ersetzens in MySQL ist sehr schlecht. Wenn mehrere Prozesse gleichzeitig verwendet werden, wird die Tabelle gesperrt, daher sollte für Aktualisierungen ein Duplikat verwendet werden. Ich habe nicht damit gerechnet, dass es zu Leistungsproblemen kommen kann, selbst wenn ich den Einfüge-Ignorierungsvorgang verwende. Ich möchte dieses Problem aufzeichnen.
Um Initialisierungsdaten in eine Tabelle einzufügen, habe ich 10 Prozesse geöffnet, um mithilfe der Insert-Ignorier-Anweisung gleichzeitig Daten in die Datenbank einzufügen. Jede Insert-Ignorier-Anweisung enthält 7 Zeilen mit Daten. Nachdem ich online gegangen war und mit der Ausführung des Skripts begonnen hatte, erschienen unerwartet viele Sperrtabellen in der Datenbank. Dem Innodb-Statusprotokoll nach zu urteilen, ist der Primärschlüssel der automatisch inkrementierenden ID der Tabelle gesperrt.
Nach langem Debuggen stellte ich fest, dass beim Ignorieren des Einfügens die S-Sperre für jede Zeile eingefügter Daten verwendet wird, um die eindeutige ID zu erkennen. Gleichzeitig wird das ID-Feld automatisch erhöht Der Primärschlüssel wird mit einer Absichtssperre (Einfügeabsicht) hinzugefügt. Wenn der Schlüssel komplexer ist, wird die Einfügungsabsichtssperre des Primärschlüssels immer belegt, wenn der eindeutige Schlüssel erkannt wird Die Einfügungsabsicht sperrt die Primärschlüssel-ID, was zu einem Deadlock führt.
Die obige Situation wurde in MySQL 8.x entdeckt. Es scheint, dass ich zuvor keine verwandten Probleme mit niedrigeren Versionen von MySQL festgestellt habe, daher weiß ich nicht, ob es Fallstricke beim Einfügen von niedrigeren Versionen von MySQL gibt, aber Die 8.x-Version eignet sich am besten zum Einfügen von „ignorieren“. Fügen Sie nicht mehrere Datenzeilen ein, insbesondere wenn der eindeutige Schlüssel komplexer ist (bestehend aus drei oder vier Feldern). Sie verwenden diese INSERT-Anweisung, um einer Tabelle etwas hinzuzufügen. Wenn bei der Verarbeitung mehrerer Zeilen ein Fehler auftritt, beendet MySQL die Anweisung und gibt einen Fehler zurück. Dadurch werden keine Zeilen in die Tabelle eingefügt.
insert ignore into actor values (3,'ED','CHASE','2006-02-15 12:34:33')
Das obige ist der detaillierte Inhalt vonSo lösen Sie das Leistungsproblem des Einfügens ignorieren in mysql8.x. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!