Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Benötigen Sie eine zeiteffiziente Methode zum Importieren großer CSV-Dateien über PHP in mehrere MySQL-Tabellen

Ich habe PHP-Skripte geschrieben, um die von Stack Overflow data dump veröffentlichten Daten massenweise zu laden. Ich importiere Millionen von Zeilen und es dauert nicht so lange.

Hier sind einige Tipps:

  • Verlassen Sie sich nicht auf Autocommit. Der Aufwand für das Starten und Festschreiben einer Transaktion für jede Zeile ist enorm. Verwenden Sie explizite Transaktionen und führen Sie nach jeweils 1000 Zeilen (oder mehr) einen Commit durch.

  • Verwenden Sie vorbereitete Anweisungen. Da Sie im Grunde die gleichen Inserts tausende Male ausführen, können Sie jeden Insert vorbereiten, bevor Sie mit dem Looping beginnen, und ihn dann während des Loops ausführen, indem Sie Werte als Parameter übergeben. Ich weiß nicht, wie das mit der Datenbankbibliothek von CodeIgniter geht, Sie müssen es herausfinden.

  • Passen Sie MySQL für den Import an. Erhöhen Sie die Cache-Puffer und so weiter. Siehe Geschwindigkeit von INSERT-Anweisungen für weitere Informationen.

  • Verwenden Sie LOAD DATA INFILE. Wenn möglich. Es ist buchstäblich 20x schneller als die Verwendung von INSERT, um Daten Zeile für Zeile zu laden. Ich verstehe, wenn Sie dies nicht können, weil Sie die letzte Insert-ID usw. abrufen müssen. Aber selbst wenn Sie die CSV-Datei lesen, neu anordnen und in mehrere temporäre CSV-Dateien schreiben, ist das Laden der Daten in den meisten Fällen immer noch schneller als mit INSERT.

  • Tun Sie es offline. Führen Sie während einer Webanforderung keine Aufgaben mit langer Laufzeit aus. Das Zeitlimit einer PHP-Anfrage beendet den Job, wenn nicht heute, dann nächsten Dienstag, wenn der Job 10% länger ist. Stellen Sie stattdessen die Webanforderung für den Job in die Warteschlange und geben Sie die Kontrolle dann an den Benutzer zurück. Sie sollten den Datenimport als Serverprozess ausführen und dem Benutzer regelmäßig einen Einblick in die Fortschrittsrate gewähren. Eine kostengünstige Möglichkeit, dies zu tun, besteht beispielsweise darin, dass Ihr Importskript "." in eine temporäre Datei, und dann kann der Benutzer anfordern, die temporäre Datei anzuzeigen und in seinem Browser immer wieder neu zu laden. Wenn Sie schick werden wollen, machen Sie etwas mit Ajax.