Ralf: Einfügern sehr vieler Datensätze dauert zu lange

Hi,

ich lese eine CSV Datei mit einem Perl Script aus und schreibe sie zeilenweise in eine MySQL DB. Code wie folgt:

  
my $dbh = DBI-> connect("DBI:mysql:database=bar","ich","passw",);  
print "Error connecting to leicode: $DBI::errstr\n"  
  unless $dbh;  
open ('myFile', "foo.dat");  
while ($zeile = <myFile>)  
{  
  
#...hier werden ein paar Zeichen verändert und noch ein paar für das Problem jetzt unwichtige Dinge gemacht, nichts rechenintensives.  
  
  my $query = "INSERT INTO fooBar(...) VALUES (...)";  
  $dbh->do($query);  
 }  
}  
close('myFile');  
$dbh->disconnect();  

Ein Import mit einem anderen Programm scheidet aus, da ich jeden Datensatz noch etwas überprüfen und ggf. verändern muss.
Nun muss ich auf diese Art ca. 1,3 Mio. Datensätze einfügen, das dauert ewig. Hat jemand eine Idee, wie das schneller gehen kann?

Gruß
Ralf

  1. Hi!

    while ($zeile = <myFile>)
    {
      my $query = "INSERT INTO fooBar(...) VALUES (...)";
      $dbh->do($query);
    }
    Hat jemand eine Idee, wie das schneller gehen kann?

    • Indexe entfernen (außer autoinkrementierendem PK), damit diese nicht immer aktualisiert werden müssen
    • Multi-Insert statt Einzel-Querys (weniger Roundtrips, aber Fehler können nicht mehr pro Datensatz erkannt werden)
    • Prepared Statements. Gerade bei Massendaten werden nur noch diese übertragen und verarbeitet statt kompletter Statements.
    • Erzeugen einer Datei mit den SQL-Anweisungen und diese per Shell importieren (keine Client-Server-Roundtrips notwendig)

    Lo!

  2. Hallo Ralf,

    wenn Du bessere Hardware hast, kannst Du auch die Prioritäten der Festplatte(n) zum Schreiben und Lesen der I/O Kanäle anpassen.

    Siehe Dir mal im MySQL 5.1 Handbuch die Seiten ab Seite 367 an.

    7.2.16. Geschwindigkeit von INSERT-Anweisungen

    Kay