Mysql
 sql >> Datenbank >  >> RDS >> Mysql

ALTER TABLE in MySQL:Freund oder Feind?

Die ALTER TABLE-Anweisung ist eine der am häufigsten verwendeten Anweisungen in der MySQL-Welt - die Anweisung ermöglicht Ihnen, Spalten in einer Tabelle hinzuzufügen, zu löschen oder zu ändern. In diesem Blogbeitrag werden wir versuchen, genauer darauf einzugehen, was es ist, was es tut und wann es verwendet werden sollte.

Was ist ALTER TABLE und was macht es?

Wie oben bereits erwähnt, ermöglicht die ALTER TABLE-Anweisung DBAs und Entwicklern, Spalten in einer Tabelle hinzuzufügen, zu löschen oder zu ändern. Einfach ausgedrückt ändert ALTER TABLE die Struktur einer Tabelle – es ermöglicht Ihnen, Spalten hinzuzufügen, zu löschen, Indizes hinzuzufügen oder zu entfernen, Spalten umzubenennen oder ihren Typ zu ändern.

Wann und wie verwende ich ALTER TABLE?

Um ALTER TABLE zu verwenden, benötigen Sie im Allgemeinen die ALTER-, CREATE- und INSERT-Privilegien. Zum Umbenennen einer Tabelle sind die erforderlichen Berechtigungen ALTER und DROP für die alte Tabelle, dann die Berechtigungen CREATE, ALTER und INSERT für die neu zu erstellende Tabelle. Um einem bestimmten Benutzer die erforderlichen Berechtigungen zuzuweisen, können Sie die folgende Abfrage verwenden:

GRANT ALTER, CREATE, INSERT ON database.* TO 'demo_user';

Ersetzen Sie database durch Ihren Datenbanknamen, den Platzhalter durch den Tabellennamen, wenn Sie möchten, dass die Privilegien nur auf bestimmte Tabellen anwendbar sind (der Platzhalter macht die Privilegien auf alle Tabellen anwendbar) und demo_user durch den Namen von Ihr Benutzer. Wenn Sie möchten, dass die Privilegien für alle Datenbanken und alle darin enthaltenen Tabellen verwendet werden, ersetzen Sie einfach database durch einen Platzhalter:

GRANT ALTER, CREATE, INSERT ON *.* TO 'demo_user';

Um die ALTER TABLE-Anweisung tatsächlich zu nutzen, führen Sie eine Abfrage aus, die die Struktur einer Tabelle ändert - ALTER TABLE wird verwendet, um Spalten in einer Tabelle hinzuzufügen, zu löschen oder zu ändern:die Abfrage kann das auch verwendet werden, um Indizes zu Spalten hinzuzufügen. Hier sind ein paar grundlegende Beispiele für die am häufigsten verwendeten Abfragen:

ALTER TABLE demo_table ADD column_name VARCHAR(255) NOT NULL DEFAULT ‘’; T

seine Abfrage würde eine Spalte column_name zu einer Tabelle demo_table hinzufügen. Fügen Sie FIRST am Ende der Abfrage hinzu, um die Spalte zur ersten Spalte in der Tabelle zu machen.

ALTER TABLE demo_table ADD column_2 VARCHAR(255) NOT NULL DEFAULT ‘’ AFTER column_1; T

seine Abfrage würde eine Spalte column_2 nach der Spalte column_1 in einer Tabelle demo_table hinzufügen.

ALTER TABLE demo_table ADD COLUMN column_2 INT GENERATED ALWAYS AS (column_1 + 1) STORED; 

Diese Abfrage würde der Tabelle eine generierte Spalte hinzufügen.

ALTER TABLE demo_table DROP COLUMN demo_column; 

Diese Abfrage würde die Spalte demo_column auf einer Tabelle demo_table löschen.

ALTER TABLE demo_table ADD INDEX demo_index(demo_column); 

Diese Abfrage würde einen Index namens demo_index (Namen können gewählt werden) zu einer Spalte namens demo_column in einer Tabelle namens demo_table hinzufügen.

ALTER TABLE demo_table ADD INDEX (demo_column), ADD UNIQUE (demo_unique); 

Diese Abfrage würde einen Index für eine Spalte demo_column und einen eindeutigen Index für die Spalte demo_unique hinzufügen.

ALTER TABLE demo_table MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4; 

Diese Abfrage würde den Standardzeichensatz einer bestimmten Spalte ändern.

ALTER TABLE demo_table CONVERT TO CHARACTER SET charset_name; 

Diese Abfrage würde den Standardzeichensatz der Tabelle und aller Zeichenspalten (CHAR, VARCHAR und TEXT) ändern.

ALTER TABLE demo_table PARTITION BY HASH(demo_column) PARTITIONS 8; 

Diese Abfrage würde die Spalte demo_column nach Hash in 8 Partitionen partitionieren.

ALTER TABLE demo_table TABLESPACE tablespace_1 STORAGE DISK; 

Diese Abfrage würde die Tabelle demo_table in einen plattenbasierten Speicher konvertieren.

Wenn Sie Indizes hinzufügen, denken Sie daran, dass Sie verschiedene Arten von Indizes hinzufügen können (z. B. einen BTREE-Index oder einen FULLTEXT-Index), Sie können auch einen Index hinzufügen, der nur eine bestimmte Menge abdeckt von Zeichen in einer Spalte mit einer Abfrage wie folgt:

ALTER TABLE demo_table ADD INDEX demo_index(column_name(10));

Die obige Abfrage würde einen Index namens demo_index zu den ersten 10 Zeichen der Spalte namens column_name in einer Tabelle namens demo_table hinzufügen.

Indizes in MySQL sind ein komplexes Ungetüm und sie verdienen wirklich ein eigenes Thema, daher werden wir hier nicht auf Details eingehen, aber wenn Sie mehr erfahren möchten, sollte unser früherer Beitrag über MySQL-Indizes einige liefern mehr Einblick.

Wie funktioniert ALTER TABLE?

ALTER TABLE in MySQL hat seine eigenen Feinheiten. Ab der aktuellsten Version von MySQL, also MySQL 8.0. Es gibt 3 Algorithmen, die beeinflussen, wie sich ALTER TABLE bei solchen Änderungen verhält. Diese sind:

  • KOPIEREN

    • Operationen werden an einer Kopie der Originaltabelle ausgeführt, und Tabellendaten werden Zeile für Zeile aus der Originaltabelle in die neue Tabelle kopiert. In den meisten Fällen kann dieser Algorithmus in Bezug auf die Ressourcennutzung sehr teuer sein, insbesondere bei großen und großen Tabellen. Wenn dieser Algorithmus gewählt oder ausgewählt wird, ist keine gleichzeitige DML zulässig, sodass alle nachfolgenden Abfragen, die sich auf die betroffene Tabelle beziehen, warten oder in die Prozessliste eingereiht werden müssen. Es besteht die Möglichkeit, dass Ihre Datenbank hängen bleibt, wenn die Verbindungen ausgereizt sind.

  • EINFÜGEN

    • Operationen vermeiden das Kopieren von Tabellendaten, können die Tabelle jedoch an Ort und Stelle neu erstellen. Während der Vorbereitungs- und Ausführungsphase der Operation kann kurzzeitig eine exklusive Metadatensperre für die Tabelle vorgenommen werden. In der Regel wird gleichzeitiges DML unterstützt.

  • SOFORT

    • Operationen ändern nur Metadaten im Datenwörterbuch. Während der Vorbereitung und Ausführung werden keine exklusiven Metadatensperren auf die Tabelle gesetzt, und die Tabellendaten bleiben unberührt, sodass Operationen sofort ausgeführt werden. Concurrent DML ist erlaubt. (Eingeführt in MySQL 8.0.12)

Der ALTER TABLE-Prozess von MySQL ist bei kleineren Tabellen möglicherweise kein Problem, aber wenn Ihr Datensatz größer ist, können Sie auf Probleme stoßen - viele Leute haben ALTER TABLE-Abfragen erlebt, die Stunden, Tage oder sogar Wochen gedauert haben fertigstellen. In den meisten Fällen geschieht dies aufgrund des oben beschriebenen Tabellenänderungsprozesses von MySQL. Es gibt jedoch eine Möglichkeit, die Zeit, die zum Abschließen der Abfrage benötigt wird, zumindest geringfügig zu verkürzen:

  1. Erstellen Sie eine neue Tabelle wie Ihre Quelltabelle mit Ihrer gewünschten Struktur, indem Sie
    CREATE TABLE demo_table_new LIKE demo_table;
    dann seine Struktur anpassen. In diesem Fall ist demo_table die Quelltabelle und demo_table_new die neue Tabelle.
  2. Daten in die neue Tabelle einfügen.
  3. Benennen Sie die alte Tabelle in demo_table_old um (passen Sie den Namen Ihren Bedürfnissen an).
  4. Benennen Sie die neue Tabelle in den früheren Namen der alten Tabelle um.
  5. Kopieren Sie abschließend die Zeilen aus der alten Tabelle in die neue Tabelle und erstellen Sie bei Bedarf Indizes.

Obwohl die obigen Schritte gut funktionieren. In realen Szenarien neigen DBAs oder Entwickler jedoch dazu, pt-online-schema-change von Percona oder gh-ost von Github zu verwenden. Sie können einen Blick auf unseren vorherigen Beitrag Top Open Source Tools for MySQL &MariaDB Migrations werfen, der einen Überblick über diese Tools zur Schemaänderung gibt.

Jedenfalls ist das, was wir oben beschrieben haben, häufig als „Schattenkopie“-Ansatz bekannt:Im Wesentlichen erstellen Sie eine neue Tabelle mit der gewünschten Struktur, führen dann eine Umbenennung und ein Ablegen durch, um die beiden Tabellen auszutauschen . Es gibt auch einen anderen Weg:Sie können auch Server austauschen und ALTER TABLE auf Servern ausführen, die nicht in Produktion sind. Für MyISAM können Sie SCHLÜSSEL DEAKTIVIEREN, Daten laden und dann SCHLÜSSEL AKTIVIEREN.

ALTER TABLE Fallstricke

Wenn Sie die ALTER TABLE-Anweisung verwenden, um Indizes zu erstellen (Sie können auch die CREATE INDEX-Anweisung verwenden), wird empfohlen, Indizes nach dem Einfügen der Daten zu erstellen, da dies eine ziemlich bekannte Methode zur Beschleunigung ist Verarbeitung nicht nur in MySQL, sondern auch in anderen Datenbankverwaltungssystemen wie Oracle. Beachten Sie jedoch im Allgemeinen, dass die meisten ALTER TABLE-Operationen einige Probleme (Unterbrechung des Dienstes) für MySQL verursachen sollten.

Es gibt jedoch auch eine andere Möglichkeit, den gesamten Prozess zu beschleunigen, wenn auch etwas fortgeschrittener:Wenn Sie MySQL davon überzeugen können, nur die .frm-Datei der Tabelle zu ändern (.frm-Dateien beschreiben die Definition von die Tabelle) und die Tabelle in Ruhe lassen, wird der Vorgang schneller:

  1. Erstellen Sie eine leere Tabelle mit demselben Layout wie die alte Tabelle, ohne sie zu ändern.
  2. Schließen Sie alle verwendeten Tabellen und verhindern Sie, dass alle neuen Tabellen geöffnet werden, indem Sie 
    FLUSH TABLES WITH READ LOCK.
  3. Tauschen Sie die .frm-Dateien aus.
  4. Heben Sie die Lesesperre auf, indem Sie UNLOCK TABLES ausführen.

Denken Sie auch daran, dass es an der Zeit sein könnte, sich nach einer anderen Syntax umzusehen, wenn Sie eine Spalte ändern möchten und die Syntax korrekt erscheint, aber immer noch ein Fehler auftritt. Zum Beispiel:

ALTER TABLE demo_table ADD long VARCHAR(255); 

Eine Abfrage wie diese würde fehlschlagen, da long ein reserviertes Wort ist. Um einen solchen Fehler zu vermeiden, maskieren Sie das Wort mit Backticks:

ALTER TABLE demo_table ADD `long` VARCHAR(255);

Es ist auch erwähnenswert, dass die Spaltennamen nur mit Backticks maskiert werden können und nicht mit einfachen oder doppelten Anführungszeichen. Eine Abfrage wie diese würde beispielsweise ebenfalls einen Fehler verursachen:

ALTER TABLE demo_table CHANGE COLUMN ‘demo_column’ ‘demo_column_2’ VARCHAR(255);

Zusammenfassung

MySQL verwendet die ALTER TABLE-Anweisung, um Spalten in einer Tabelle hinzuzufügen, zu löschen oder zu ändern. Damit die Anweisung erfolgreich ausgeführt werden kann, müssen Sie über die Berechtigungen ALTER, CREATE und INSERT für die Tabelle verfügen. Die Anweisung hat auch einige Feinheiten, die einzigartig für sich selbst sind:Ihre Leistung kann aufgrund der Art und Weise, wie sie funktioniert, leiden, wenn sie auf sehr großen Tabellen ausgeführt wird, aber solange Sie wissen, wie die Anweisung funktioniert und was sie tut, sollte alles in Ordnung sein.