For-Schleife wird erschreckend langsam
-
Achja, warum machst du eigentlich 13.000 Inserts? Ganz dumm aber e4rnsthaft gefragt.

Dem Kunden oder deinem Chef würde ich einfach mal einen gleichen Test auf einer Oracle oder so präsentieren, falls diese schneller ist. Kann ich nicht versichern, aber dann haste Beweise das es nicht an deinem Code liegt.
-
Kopierst Du von mySQL nach mySQL?
Dann gib es folgende Alternativen:
insert into ... select (http://dev.mysql.com/doc/mysql/en/insert-select.html)
Load Data infile (http://dev.mysql.com/doc/mysql/en/load-data.html)Allgemein: http://dev.mysql.com/doc/mysql/en/insert-speed.html
Wenn Du von mySQL in einer andere DB (z.B. Oracle) kopierst, solltest Du Dir die import Features dieses DBMS anschauen. Und dann ist meistens am besten, über eine Datei zu importieren.
Eine weitere wichtige Rolle bei der Einfügegeschwindigkeit spielen Transaktionen.
Solche Fragen gehören eher ins Datenbank Forum...
-
schonmal ausprobiert einfach die forschleife umzudrehen? Also
for (nIndex = Import->GetResultCount()-1; nIndex >= 0; nIndex--)
-
niemand schrieb:
Kopierst Du von mySQL nach mySQL?
Load Data infileUi ui, hat MySQL keine Storedprocedures???

SPs haben heute wegen Preparedstatements fast keine Daseinsberechtigung, aber für solche Dinge sind sie natürlich weiter unerlässlich.
-
Also ich kopiere Daten von einer Software zu einer anderen. Die Datenbanken sind in vielen Punkten ähnlich, aber nicht gleich. Das ganze ist ein grösseres Software-Update.
Ich habe jetzt mal das INSERT Statement entfernt und siehe da, es rattert nur so durch. Darauf muss man erst mal kommen.
Ich werde mich mal durch den Link von 'niemand' durcharbeiten, aber ich habe jetzt schonmal einen Ansatzpunkt.
Vielen Dank an alle für Ihre Bemühungen !

Viele Grüße
Chrisitan
-
Artchi schrieb:
Ui ui, hat MySQL keine Storedprocedures???

Kommen afaik mit Verison 5, hilft MySql aber auch nix.
MfG SideWinder
-
SciFi schrieb:
Ich frage ja mit "SELECT * FROM..." ab und bekomme als Ergebnis alle Daten. Wenn ich jetzt selektiere mit von bis, habe ich bestimmt wieder das gleiche in Grün.
du könntest es z.b. so machen
# pseudo... last_id = -1; while (have rows) do SELECT * from table WHERE id > lastid ORDER BY id ASC LIMIT 1000 while (have rows) do # insert query processed_ids = row.id; end endhift das?
-
Ich denke schon, aber MySQL hat wohl Probleme mit der Menge an Daten die ich da rüberschaufel. Ich müsste dann noch den 1000 eine kleine Pause machen.
Momentan suche ich noch nach INSERT Ergänzungen.
-
Wenn du Indizes verwendest bremsen die Inserts das System möglicherweise.
Kannst du nicht vor den Inserts den Index löschen und ihn erst nach
Beendigung ALLER Inserts neu erstellen.Ein andere Möglichkeit ist vielleicht die Verwendung von Transaktionen.
Nur jeweils alle 1000 Inserts ein commit könnte dann auch helfen.
-
Danke für den Hinweis. Wenn das jetzt nicht klappen sollte, dann werde ich die Insert's in eine Datei schreiben und diese von der mysql.exe importieren lassen. Das ist zwar nicht die Lösung die ich gerne hätte, aber die andere ist wirklich zu langsam.
-
EDIT: murks
-
murks ?
-
SciFi schrieb:
Wenn das jetzt nicht klappen sollte, dann werde ich die Insert's in eine Datei schreiben und diese von der mysql.exe importieren lassen. Das ist zwar nicht die Lösung die ich gerne hätte, aber die andere ist wirklich zu langsam.
Und wieso soll's davon schneller werden?