Mailinglisten-Archive |
Tag,
kurz als Einleitung: habe eine Textdatei mit unheimlich vielen Datensaetzen, die ich erst im PHP
aufbereiten muss. Die sollen in ein Mysqldatenbank. Die Datensaetze sollen auffrischbar sein, dass
heisst wird die gleiche Datei mit leicht geaenderten Werten eingelesen und die Key-Werte haben sich
nicht geaendert, so sollen die entsprechenden Felder in der DB mit "update" versehen werden. Wenn
nicht vorhanden, dann "INSERT".
Das ganze geht auf einem 1000 AMD mit uebel viel Speicher noch immer quaelend langsam (fuer 2mb
dauerts 30min!!). Linux "top" sagt mir, das der Bottleneck das Mysql ist.
Bislang nahm ich einen Datensatz aus der Datei, zerlegte ihn mittels Regexp und anderen Spaessen,
schaute anhand der Keywerte in die Db, ob da oder nicht und machte demzufolge ein INSERT oder
UPDATE.
Langsam.
Dann las ich im Mysqlmanual, dass man INSERTs doch gefaellixt in einem Rutsch abarbeiten sollte
und nicht durch lahme Selects immer unterbrechen sollte, und dass ja jedesmal die Indizes neu erstellt
usw.
Also, dachte ich mir, hauste einfach viele Anweisungen hintereinander ans MYSQL. Das geht leider mit
PHP nicht, die Funktion mysql_query nimmt immer nur eine Anweisung an.
Daraufhin die Idee, dynamisch am Ende des Scripts eine Datei mit den SQL-Anweisungen zu erstellen
und diese mittels exec("mysql db < datei.sql"); einzulesen. Klappt so lala, nicht wirklich gut.
Notwendige Zeilenumbrueche zerhaut das Mysql total, es werden hoechstens 20 Eintraege ordentlich
eingelesen, dann meldet mysql das \\ kein Befehl sei (\\ kommt in Feldern vor, aber auch nur IN
Feldern)
Das ist also nicht die Loesung.
Deswegen die Fragen:
Kann man MYSQL mit PHP zu einer persistenten Verbindung ueberreden, so dass die ekeligen
Neuconnects entfallen ? Kann man evt doch mehr als eine Query auf einen Rutsch absenden ?
Das ganze ist uebrigens ziemlich heikel, denn wenn die Daten erst am Ende des Scripts geschrieben
werden oder gar noch spaeter, und evt durch einen anderen Mitarbeiter die gleiche Datei ebenfalls
abgearbeitet wird, dann sind die Eintraege 2x drin. Und das ist mein Horror, darf nicht.
Also, wie gehts schneller mit MYSQL+PHP?
php::bar PHP Wiki - Listenarchive