ich habe eine wirklich mühsame Zeit versucht, eine große CSV-Datei in mysql auf localhost zu importieren
Der CSV ist etwa 55 MB und hat etwa 750.000 Zeilen.
ive greift jetzt auf ein Skript zurück, das die csv analysiert und die Zeilen 1 nach 1 ablegt.
here den Code:
%Vor%Das Problem ist, dass es ewig dauert, um es auszuführen ... alle Lösungen wären großartig.
Sie erfinden das Rad neu. Sehen Sie sich das Tool mysqlimport an, das mit MySQL geliefert wird. Es ist ein effizientes Werkzeug zum Importieren von CSV-Dateien.
mysqlimport ist eine Befehlszeilenschnittstelle für die LOAD DATA LOCAL INFILE
SQL-Anweisung.
Entweder sollte 10-20x schneller ausgeführt werden als INSERT Zeile für Zeile.
Ihr Problem ist wahrscheinlich, dass Sie Autocommit aktiviert haben (standardmäßig), sodass MySQL für jede Einfügung eine neue Transaktion festlegt. Sie sollten Autocommit mit SET autocommit=0;
deaktivieren. Wenn Sie zur Verwendung der mysqli-Bibliothek wechseln können (und wenn möglich, sollten Sie dies tun), können Sie mysqli::autocommit(false)
verwenden, um Autocommitting zu deaktivieren.
Ich habe dies mit SQL Server gemacht:
Ich hatte eine ähnliche Situation, wo es NICHT möglich war, LOAD DATA zu verwenden. Transaktionen waren zeitweise ebenfalls inakzeptabel, da Daten auf Duplikate überprüft werden mussten. Im Folgenden wurde jedoch die Verarbeitungszeit für einige meiner Importdateien drastisch verkürzt.
Setzen Sie vor Ihrer while-Schleife (CSV-Zeilen) autocommit auf 0 und starten Sie eine Transaktion (nur InnoDB):
%Vor%Setzen Sie nach der Schleife autocommit fest und setzen Sie es zurück auf 1 (Standard):
%Vor%Ersetzen Sie mysql_query () durch das Datenbankobjekt, das Ihr Code verwendet. Ich hoffe, das hilft anderen.