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