Importieren von großen CSV in MySQL-Datenbank

8

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.

    
scarhand 03.08.2011, 20:16
quelle

7 Antworten

6

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.

    
Bill Karwin 03.08.2011, 20:40
quelle
2

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.

%Vor%     
Jack Edmonds 03.08.2011 20:22
quelle
2

Es wird viel schneller sein LOAD DATA wenn Sie können

    
Paul Creasey 03.08.2011 20:36
quelle
1

versuche es in einer Abfrage.

Es könnte durch Ihre my.cnf (mysql-Konfiguration) obwohl

eingeschränkt werden %Vor%

Wenn es nicht funktioniert, können Sie dies versuchen (automatische Übertragung deaktivieren)

%Vor%     
genesis 03.08.2011 20:26
quelle
1

Ich habe dies mit SQL Server gemacht:

  • Ich habe den SQL-Bulkinsert-Befehl in Kombination mit Datentabellen verwendet.
  • Datentabellen befinden sich im Speicher und werden aus dem Lesen von Zeilen in der Datei erstellt.
  • Jede Datentabelle besteht aus einem Block von Zeilen, nicht aus der gesamten Datei.
  • Behalten Sie den vom Chunk abgearbeiteten Chunk im Auge, indem Sie die Zeiger der letzten gelesenen Zeile und die maximale Chunk-Größe beibehalten.
  • Wenn Sie die Datei lesen. Verlassen Sie die Schleife, wenn die Zeilen-ID & gt; letzte Zeile + Chunk-Größe.
  • Keeping in looping und weiter einfügen.
Internet Engineer 03.08.2011 20:32
quelle
0

Auch manchmal, wenn Sie Daten laden verwenden, wird bei Warnungen der Import gestoppt. Sie können das Schlüsselwort ignore verwenden.

%Vor%     
firstever 03.08.2011 20:48
quelle
0

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.

    
jjwdesign 02.02.2013 16:07
quelle

Tags und Links