Ich arbeite gerade an einer Webapp die täglich mehrere DBase Dateien mit MySQL synchronisieren muss. Es gibt 2-3 kleine mit bis zu 2.000 bis 3.000 Datensätze und eine große mit 200.000 Datensätze. Jede DBase Datei hat ca. 10-20 Spalten wobei ich nur manche (5-10) wirklich brauche, die anderen sind unwichtig.
Bisher habe ich ein Yii Console Command erstellt das die Dateien via PHP einliest und dann prüfe ich ob es die Daten schon gibt und falls nicht, füge ich sie ein. Bisher suche ich über findByAttributes und füge sie dann über
$x = new Model Y; $x->attribut = "bla"
ein. Bei 2.000 bis 3.000 Datensätzen dauert das ca. 5 Minuten, finde ich akzeptabel. Aber bei den 200.000 Datensätzen hat es zuletzt ca. 20 Stunden gedauert...glaub ich. Test das nicht so oft weil es so lange dauert;) Habe InnoDB Tabellen und die Config schon aus verschiedenen Quellen heraus optimiert. Aber dauert trotzdem noch ziemlich lange. Das Problem ist das viele Datensätze voneinander abhängig sind, sonst würde ich einfach größere Queries erstellen. So muss ich wirklich bei allen 200.000 Zeilen ca. 5-15 Queries durchführen.
Achso am Anfang setze ich ein "delete" Attribut bei allen Datensätzen auf true und in der afterFind bzw afterSave Methode setze ich es auf false. Am Schluss lösche ich alle bei denen delete auf true steht. So das alte Daten aus der SQL Datenbank rausfliegen.
Und bei einigen Modellen ist in der afterSave bzw. beforeDelete Methode eine Funktion die eine Log Nachricht erstellt und auch in der Datenbank speichert. Später soll genau ersichtlich sein was sich wann geändert hat. Ich denke das bremst auch nochmal ziemlich, da es die SQL Anweisungen ja verdoppelt...
Was für Möglichkeiten gibt es das ganze zu Optimieren? Ich fände es schön wenn der ganze Import nur noch ca. 2-4 Stunden dauert.

Help













