it-swarm.com.de

MySQL ist sehr langsam für die Abfrage von Alter Tables

Warum dauert es mehr als eine Stunde, diese Tabelle einfach zu aktualisieren, um eine Spalte hinzuzufügen? Diese Tabelle enthält 15 Millionen Zeilen. Es hat 2 Indizes und einen Primärschlüssel. Die ALTER TABLE-Abfrage befindet sich nun seit 1 Stunde 15 Minuten im Status "In tmp-Tabelle kopieren".

ALTER TABLE `frugg`.`item_catalog_map` 
ADD COLUMN `conversion_url` TEXT NULL DEFAULT NULL

Tabelle:

mysql> describe item_catalog_map;
+------------------------+---------------+------+-----+---------+-------+
| Field                  | Type          | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| catalog_unique_item_id | varchar(255)  | NO   | PRI | NULL    |       |
| catalog_id             | int(11)       | YES  | MUL | NULL    |       |
| item_id                | int(11)       | YES  | MUL | NULL    |       |
| price                  | decimal(10,2) | YES  |     | 0.00    |       |
+------------------------+---------------+------+-----+---------+-------+

mysql> show index from item_catalog_map;
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
| Table            | Non_unique | Key_name             | Seq_in_index | Column_name            | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
| item_catalog_map |          0 | PRIMARY              |            1 | catalog_unique_item_id | A         |    15485115 |     NULL | NULL   |      | BTREE      |         |
| item_catalog_map |          1 | IDX_ACD6184FCC3C66FC |            1 | catalog_id             | A         |          18 |     NULL | NULL   | YES  | BTREE      |         |
| item_catalog_map |          1 | IDX_ACD6184F126F525E |            1 | item_id                | A         |    15485115 |     NULL | NULL   | YES  | BTREE      |         |
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
48
David Parks

Die Leistung von MySQL ALTER TABLE kann bei sehr großen Tabellen zu einem Problem werden. MySQL führt die meisten Änderungen durch, indem es eine leere Tabelle mit der gewünschten neuen Struktur erstellt, alle Daten aus der alten Tabelle in die neue Tabelle einfügt und die alte Tabelle löscht. Dies kann sehr lange dauern, insbesondere wenn der Arbeitsspeicher knapp ist, die Tabelle groß ist und viele Indizes enthält. Viele Leute haben Erfahrung mit ALTER TABLE-Operationen, die Stunden oder Tage in Anspruch genommen haben.

Wie auch immer, wenn Sie mit dem Ändern der Tabelle fortfahren müssen, können Ihnen möglicherweise die folgenden Ressourcen helfen:

59

Wenn Sie sich nicht für Ausfallzeiten interessieren, ist mein Vorschlag die Verwendung von drei getrennten ALTER TABLE Aussagen. Die erste Anweisung entfernt alle vorhandenen Sekundärindizes. Die zweite Anweisung wendet alle spaltenbezogenen Änderungen an. Die letzte Anweisung fügt abgelegte Sekundärindizes zurück und wendet andere Indexänderungen an.

Noch zwei Tipps:

  1. Führen Sie vor dem Anwenden von Indexänderungen die beiden folgenden Anweisungen aus und setzen Sie die Werte nach Abschluss der Indexänderung auf 1 zurück.

    SET unique_checks=0;
    SET foreign_key_checks=0;
    
  2. Wenn Sie mehrere Sekundärindizes erstellen, fügen Sie diese in einen ALTER TABLE Anweisung statt mehrere getrennte ALTER TABLE Aussagen.

Das folgende Bild zeigt den Leistungsunterschied. Ansatz 1 ist Ihr Ansatz und Ansatz 2 ist mein Weg. Ansatz 2 benötigt ca. 3,47% Zeit im Vergleich zu Ansatz 1 für eine 50-m-Tabelle. Die Lösung funktioniert nur für die MySQL (> = 5.5) InnoDB-Engine.

enter image description here

24
Albert Wang

Die Percona-Tools sind ein Lebensretter für dieses Zeug mit großen Tischen.

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

sie im Grunde:

  1. erstellen Sie eine doppelte Tabelle
  2. trigger zum Synchronisieren von Tabellen erstellen
  3. massenkopiedaten
  4. überprüfen
  5. tische tauschen

Dauert ewig, aber wen interessiert das schon, denn so können Sie die Spalten ohne Ausfallzeiten wechseln.

8
jdwyah

Ihr Tisch hat 15 Millionen Zeilen, das ist etwas. In der ALTER TABLE werden alle Daten aus der Tabelle kopiert und die Indizes neu erstellt. Versuchen Sie als erste Messung, die Datendatei (item_catalog_map.MYD, falls es sich um MyISAM handelt) in Ihr Dateisystem zu kopieren, und prüfen Sie, wie lange dies dauert. Dies ist die Zeit, die die ALTER TABLE mindestens benötigt.

7
AndreKR