Ich habe nur versucht, einer Tabelle (main_table) in einer Datenbank eine Spalte mit dem Namen "location" hinzuzufügen. Der Befehl, den ich ausführe, war
ALTER TABLE main_table ADD COLUMN location varchar (256);
Die main_table enthält> 2.000.000 Zeilen. Es läuft länger als 2 Stunden und ist immer noch nicht fertig.
Ich habe versucht, mytop
die Aktivität dieser Datenbank zu überwachen, um sicherzustellen, dass die Abfrage nicht durch einen anderen Abfrageprozess gesperrt ist, aber es scheint nicht. Soll es so lange dauern? Eigentlich habe ich den Computer gerade neu gestartet, bevor ich diesen Befehl ausgeführt habe. Jetzt läuft dieser Befehl noch. Ich bin mir nicht sicher, was ich tun soll.
mysql
performance
alter
Fanchyna
quelle
quelle
NULL
In diesem Fall wird standardmäßig nicht angegeben, warum es lange dauert.ALTER TABLE .. ADD COLUMN .. ALGORITHM=INSTANT
Antworten:
Ihre
ALTER TABLE
Aussage impliziert, dass MySQL jede einzelne Zeile der Tabelle einschließlich der neuen Spalte neu schreiben muss. Da Sie mehr als 2 Millionen Zeilen haben, würde ich definitiv erwarten, dass es eine beträchtliche Zeit in Anspruch nimmt, während der Ihr Server wahrscheinlich größtenteils E / A-gebunden sein wird. Normalerweise ist es performanter, Folgendes zu tun:CREATE TABLE main_table_new LIKE main_table; ALTER TABLE main_table_new ADD COLUMN location VARCHAR(256); INSERT INTO main_table_new SELECT *, NULL FROM main_table; RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; DROP TABLE main_table_old;
Auf diese Weise fügen Sie die Spalte in die leere Tabelle ein und schreiben im Grunde genommen die Daten in diese neue Tabelle, von denen Sie sicher sind, dass sie niemand anderes betrachtet, ohne so viele Ressourcen zu sperren.
quelle
Ich denke, die passende Antwort hierfür ist die Verwendung einer Funktion wie pt-online-schema-change oder gh-ost .
Wir haben damit eine Migration von über 4 Milliarden Zeilen durchgeführt, obwohl dies bis zu 10 Tage dauern kann, mit weniger als einer Minute Ausfallzeit.
Percona arbeitet sehr ähnlich wie oben
quelle
Das Ändern von Tabellen dauert bei großen Datenmengen wie in Ihrem Fall sehr lange. Vermeiden Sie es daher, sie in solchen Situationen zu verwenden, und verwenden Sie Code wie diesen:
select main_table.*, cast(null as varchar(256)) as null_location, -- any column you want accepts null cast('' as varchar(256)) as not_null_location, --any column doesn't accept null cast(0 as int) as not_null_int, -- int column doesn't accept null into new_table from main_table; drop table main_table; rename table new_table TO main_table;
quelle