Ich lade eine 100-GB-Datei über LOAD DATA INFILE. Ich hatte gute Erfolge mit MyISAM, ein paar Stunden und fertig.
Ich versuche es jetzt mit InnoDB. Der Ladevorgang beginnt schnell bei über 10 MB / Sek.file_per_table
).
Aber nach ungefähr 5 GB Daten verlangsamt es sich auf den Bereich von 2 bis 4 MB / s, da ich über 20 GB habe, war es um 2 MB / s niedriger.
Die Größe der InnoDB-Pufferpools beträgt 8 GB. Vor dem Ausführen des Befehls LOAD DATA INFILE habe ich Folgendes ausgeführt:
SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....
Ich kann den Grund nicht erkennen, warum es gut anfängt und sich mit der Zeit verlangsamt.
Außerdem habe ich mit denselben Einstellungen denselben Befehl LOAD DATA INFILE mit der Tabelle ausgeführt, wobei InnoDB und MyISAM sowie ein 5-GB-Testdatensatz verwendet wurden. MyISAM war 20-mal schneller:
InnoDB:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 min 25.38 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
MyISAM:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (1 min 2.52 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
Was sollte ich sonst noch versuchen? Die MyISAM-Engine kann die Laderate viel besser halten.
Zusätzliche Details:
Ich habe versucht, die Dateien einzeln zu laden, kein Unterschied.
Ich habe übrigens 150 Dateien mit je 500 MB, in jeder Datei sind die Schlüssel sortiert.
Nach dem Erreichen von 40 GB über Nacht, 12 Stunden später, war die Laderate auf 0,5 MB / s gesunken, was bedeutet, dass der Betrieb praktisch unmöglich ist.
Ich habe keine anderen Antworten auf ähnliche Fragen in anderen Foren gefunden. Es scheint mir, dass InnoDB das Laden großer Datenmengen in Tabellen mit einer Größe von mehr als einigen GB nicht unterstützt.
quelle
Die endgültige Antwort auf diese Frage war, InnoDB nicht für eine umfangreiche Referenztabelle zu verwenden. MyISAM schreit schnell, fast der volle Durchsatz der Festplattengeschwindigkeit für die gesamte Last, InnoDB bleibt hängen. MyISAM ist einfach, aber in diesem Fall sind es auch die Anforderungen dieser Tabelle. Für eine einfache Referenztabelle mit Bulk-Ladevorgängen über LOAD DATA INFILE ist MyISAM der beste Weg.
Beachten Sie jedoch, dass bei der Ausführung von MyISAM- und InnoDB-Tabellen die Speicherzuordnung für zwei Caching-Mechanismen berücksichtigt werden muss. Jedes Modul verfügt über eine eigene eindeutige Zwischenspeicherung, die eine separate Speicherzuordnung erfordert.
quelle
Sie könnten versuchen, Ihre Eingabedateien in kleinere Teile aufzuteilen.
Ich persönlich benutze dafür http://www.percona.com/doc/percona-toolkit/2.1/pt-fifo-split.html .
Was passiert, wenn Sie beim Import eine Tabellensperre für die Tabelle erhalten? Möglicherweise wird InnoDB durch das Sperren auf Zeilenebene verlangsamt (MyISAM verwendet eine Tabellensperre).
Weitere Ideen finden Sie auch hier: http://derwiki.tumblr.com/post/24490758395/loading-half-a-billion-rows-into-mysql
quelle
Wenn Ihr PK nicht AUTO_INCREMENT ist oder die Daten in der CSV-Datei nicht nach PK sortiert sind, kann dies die Leistung des Datenladens beeinträchtigen. Da die Tabelle in MySQL ein Index ist, werden alle Daten in sortierter Reihenfolge gespeichert. Wenn der PK-Wert nicht AUTO_INCREMENT ist, muss MySQL viele Daten verschieben, um die Daten in sortierter Reihenfolge zu speichern. Dies ist der Grund für ein langsameres Laden der Daten, wenn die Tabellengröße zu wachsen beginnt.
Ich lade eine 91-GB-CSV-Datei mit PK in AUTO_INCREMENT mit LOAD DATA INFILE und sehe keinen Rückgang meines Durchsatzes. Ich erhalte 140K bis 145K Einfügungen pro Sekunde. Verwenden von Percona MySQL 5.6.38
quelle