Ich möchte Daten zwischen 2 InnoDB-Tabellen migrieren.
Derzeit führe ich diese Abfrage aus:
INSERT INTO table_a SELECT * FROM table_b;
Was ist der beste Weg, um eine CPU-Überlastung zu vermeiden, wenn der Datensatz wächst?
Vielen Dank
Ich möchte Daten zwischen 2 InnoDB-Tabellen migrieren.
Derzeit führe ich diese Abfrage aus:
INSERT INTO table_a SELECT * FROM table_b;
Was ist der beste Weg, um eine CPU-Überlastung zu vermeiden, wenn der Datensatz wächst?
Vielen Dank
Antworten:
Da Sie InnoDB verwenden, möchte ich Folgendes vorschlagen:
Wenn Sie INSERT, UPDATEs und DELETEs ausführen, laden Sie die Tabelle wie folgt in großen Mengen:
CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT * FROM table_b;
ALTER TABLE table_a RENAME table_old;
ALTER TABLE table_new RENAME table_a;
DROP TABLE table_old;
Wenn Sie nur INSERTs und SELECTs ausführen, laden Sie neue Einträge in die Tabelle. Unter der Annahme , den Primärschlüssel table_a
und table_b
wird id
, führen die Last wie folgt aus :
CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT B.* FROM table_b B
LEFT JOIN table_a A USING (id) WHERE A.id IS NULL;
INSERT INTO table_a SELECT * FROM table_new;
DROP TABLE table_new;
Stellen Sie sicher, dass Sie MySQL 5.5 verwenden. Wenn Sie MySQL 5.1.38 oder höher haben, müssen Sie das InnoDB-Plugin installieren . Wenn Sie MySQl 5.1.37 oder früher haben, aktualisieren Sie einfach auf MySQL.
Sobald Sie dies getan haben (oder wenn Sie bereits MySQL 5.5 haben), müssen Sie InnoDB für mehrere CPUs optimieren. Anstatt das Rad neu zu erfinden, sind hier meine letzten Beiträge darüber, wie und warum dies zu tun ist:
May 26, 2011
: Informationen zur Leistung von Single-Threaded- und Multithread-DatenbankenSep 12, 2011
: Kann MySQL mehr als einen Kern verwenden?Mar 16, 2012
: Verwenden mehrerer Kerne für einzelne MySQL-Abfragen unter DebianApr 26, 2012
: Ist die CPU-Leistung für einen Datenbankserver relevant?Versuche es !!!
Ich könnte andere Dinge wie Puffer, Protokolldateien usw. vorschlagen. Ich habe nur diese beiden Bedenken angesprochen.
In diesem Fall ist normalerweise die beste Lösung ein mysqldump mit der folgenden --tab
Option:
mysqldum --tab=/path/to/serverlocaldir --single-transaction <database> table_a
Die Tab-Option erzeugt 2 Dateien, eine Datei -table_a.sql-, die nur die Anweisung create table enthält, und die andere Datei -table_a.txt- enthält tabulatorgetrennte Daten.
Jetzt können Sie Ihre neue Tabelle erstellen
create table table_b like table_a;
Dann laden Sie einfach Daten in Ihre neue Tabelle über, LOAD DATA
ohne auf den Namen der Tabelle zu achten.
LOAD DATA INFILE '/path/to/serverlocaldir/table_a.txt'
INTO TABLE table_b FIELDS TERMINATED BY '\t' ...
LOAD DATA ist normalerweise 20-mal schneller als die Verwendung von INSERT-Anweisungen.
Hoffe das hilft