Heim  >  Artikel  >  Datenbank  >  So lösen Sie das Problem der langsamen Feldänderung in großen MYSQL-Tabellen

So lösen Sie das Problem der langsamen Feldänderung in großen MYSQL-Tabellen

WBOY
WBOYnach vorne
2023-05-26 11:11:502491Durchsuche

Bei großen Tabellen wird die Leistung der ALTER TABLE-Operation von MYSQL zu einer erheblichen Herausforderung. Die Art und Weise, wie MYSQL die meisten Vorgänge zur Änderung der Tabellenstruktur durchführt, besteht darin, eine leere Tabelle mit einer neuen Tabellenstruktur zu erstellen, alle Daten aus der alten Tabelle abzurufen, sie in die neue Tabelle einzufügen und dann die alte Tabelle zu löschen. Dieser Vorgang kann sehr zeitaufwändig sein, wenn nicht genügend Speicher vorhanden ist und die Tabelle groß ist und viele Indizes enthält. ALTER TABLE-Vorgänge dauern oft Stunden oder sogar Tage, eine Situation, die viele Menschen kennen.

Normalerweise stoppen die meisten ALTER TABLE-Vorgänge den MYSQL-Dienst. Für häufige Szenarien können nur zwei Techniken verwendet werden:

  • Eine besteht darin, zuerst den ALTER TABLE-Vorgang auf einem Computer auszuführen, der keine Dienste bereitstellt, und dann Führen Sie die ALTER TABLE-Operation auf einer Maschine aus, die keine Dienste bereitstellt, und führen Sie dann die ALTER TABLE-Operation auf einer Maschine aus, die keine Dienste bereitstellt.

  • Eine weitere Technik ist „Schattenkopie“. Bei der Schattenkopietechnik wird eine neue Tabelle erstellt und die gewünschte Tabellenstruktur bearbeitet. Anschließend werden die beiden Tabellen durch Umbenennen und Löschen von Tabellen ausgetauscht.

Nicht alle ALTER TABLE-Vorgänge führen zu einer Tabellenrekonstruktion. Es gibt zwei verschiedene Möglichkeiten, den Standardwert einer Spalte zu ändern oder zu entfernen: eine davon ist schnell und die andere langsamer.

Wenn Sie die Standard-Leihdauer eines Films von drei Tagen auf fünf Tage ändern möchten. Das Folgende ist ein sehr langsamer Weg:

mysql> ALTER TABLE film modify column rental_duration tinyint(3) not null default 5;

Die Anzahl der Operationen für 1000 Lesevorgänge und 1000 Einfügungen kann über „SHOW STATUS“ abgerufen werden. Mit anderen Worten: Es kopiert die gesamte Tabelle in eine neue Tabelle, einschließlich des Datentyps, der Größe und der Nullattribute der Spalte.

Theoretisch kann MYSQL den Schritt der Erstellung einer neuen Tabelle überspringen. Die Standardwerte der Tabelle werden in der .frm-Datei gespeichert, sodass diese Datei direkt bearbeitet werden kann, ohne die Tabelle selbst zu ändern. Obwohl diese Optimierungsmethode machbar ist, wird sie in MYSQL derzeit nicht verwendet, sodass das Ändern von Spaltenoperationen eine Neuerstellung der Tabelle erfordert.

Eine andere Methode besteht darin, den Standardwert der Spalte durch die ALTER COLUMN-Operation zu ändern;

mysql> ALTER TABLE film ALTER COLUMN rental_duration set DEFAULT 5;

Diese Anweisung ändert die .frm-Datei direkt, ohne die Tabellendaten einzubeziehen. Dieser Vorgang ist also sehr schnell.

Nur die .frm-Datei ändern

Obwohl es sehr schnell geht, die .frm-Datei der Tabelle zu ändern, erstellt MySQL die Tabelle manchmal unnötigerweise neu Wie im obigen Beispiel zu sehen ist. Wenn man ein gewisses Risiko eingeht, kann MYSQL andere Arten von Änderungen vornehmen, ohne die Tabelle neu erstellen zu müssen.

HINWEIS Die unten gezeigten Techniken werden nicht offiziell unterstützt oder dokumentiert und funktionieren möglicherweise nicht ordnungsgemäß. Verwenden Sie diese Techniken auf eigenes Risiko. >Es wird empfohlen, die Daten vor der Ausführung zu sichern!

Die folgenden Vorgänge erfordern möglicherweise keine Neuerstellung der Tabelle:

  • Entfernen (nicht hinzufügen) Sie das AUTO_INCREMENT-Attribut einer Spalte.

  • ENUM hinzufügen, entfernen oder ändern und SET immer aktiviert. Wenn Sie einen konstanten Wert löschen, der bereits in einer Zeile verwendet wurde, gibt die Abfrage eine leere Zeichenfolge zurück.

Schritte:

  • Erstellen Sie eine leere Tabelle mit derselben Struktur und nehmen Sie die erforderlichen Änderungen vor (z. B : Erhöhen Sie die ENUM-Konstante).

  • FLUSH TABLES MIT READ LOCK ausführen. Dadurch werden alle verwendeten Tabellen geschlossen und verhindert, dass Tabellen geöffnet werden.

  • .frm-Dateien austauschen.

  • Führen Sie UNLOCK TABLES aus, um im zweiten Schritt die Lesesperre aufzuheben.

Das Folgende ist ein Beispiel für das Hinzufügen einer Konstante zur Bewertungsspalte der Filmtabelle. Die aktuelle Spalte sieht so aus:

mysql> SHOW COLUMNS FROM film LIKE 'rating';
mysql> CREATE TABLE film_new like film;
mysql> ALTER TABLE film_new modify column rating ENUM('G','PG','PG-13','R','NC-17','PG-14') DEFAULT 'G';
mysql> FLUSH TABLES WITH READ LOCK;
Als nächstes verwenden Sie den Betriebssystembefehl, um die .frm-Datei auszutauschen: Kehren Sie dann zur MySQL-Befehlszeile zurück, Sie können jetzt die Tabelle entsperren und die Auswirkung sehen die Änderung: # 🎜🎜#
mysql> UNLOCK TABLES;
mysql> SHOW COLUMNS FROM film like 'rating'\G
Feld: BewertungTyp: enum('G','PG','PG-13','R','NC-17 ','PG- 14')
Field Type Null#🎜🎜 Nr ('G','PG','PG-13','R','NC-17') JA # 🎜🎜#G
Nehmen wir an, wir müssen eine PG für Eltern hinzufügen, die vorsichtiger sind der Filme -14 Filmbewertung: Beachten Sie, dass wir am Ende der konstanten Liste einen neuen Wert hinzufügen. Wenn Sie den neuen Wert in die Mitte setzen, zum Beispiel: Nach PG-13 ändert sich die Bedeutung der vorhandenen Daten: Der vorhandene R-Wert wird zu PG-14 und der vorhandene NC-17 wird zu R, warten Sie.
/var/lib/mysql/sakila# mv film.frm film_tmp.frm
/var/lib/mysql/sakila# mv film_new.frm film.frm
/var/lib/mysql/sakila# mv film_tmp.frm film_new.frm
****************** 1. Zeile******************** *****

Als letztes müssen Sie die Hilfstabelle löschen, die zum Abschließen dieses Vorgangs erstellt wurde:

mysql> DROP TABLE film_new;

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der langsamen Feldänderung in großen MYSQL-Tabellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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