XML->DB Import INSERT/UPDATE Performance

Spelmann

Erfahrenes Mitglied
Hallo, ich befasse mich zum ersten Mal mit der Aufgabe, täglich eine XML mit mehr als 2500 Datensätzen (ca. je 20 Knoten) via PHP in eine MySQL Datenbank zu importieren.

Frage zur Performance:
Lösche ich täglich den Inhalt der Datenbank und schreibe alle Datensätze neu, oder ist es sinnvoll nur geänderte Datensätze zu aktualisieren?

Vielen Dank für Anregungen.
 
Hi

Ggf. eine Leerung und 2500 am Tag? Ganz egal, nimm was einfacher ist.

Jedenfalls, falls man was für die Performance tun will:
a) Prepared Statements (und zwar mit einem prepare, nicht einem pro XML-Datensatz. Bei dir wird das bei der Querygenerierung Änderungen erfordern).

b) ID der Tabelle AutoIncrement machen, falls sie es nicht schon ist, und beim Einfügen nicht extra angeben (sondern die DB entscheiden lassen). Damit weiß die DB, dass eine Suche nach doppelten IDs nicht nötig ist. Falls man sonst noch irgendwo unique-Felder hat, möglichst einen passenden Index drauf.

c) Leeren dürfte besser sein,

Es gibt da allerdings außer der Geschwindigkeit noch ein Problem (egal ob Leeren oder ändern):
Was kann passieren, wenn etwas die DB ausliest während die Änderung läuft?
Kann was kaputtgehen, wenn teilweise alte und neue Datensätze erhalten werden?
 
Zuletzt bearbeitet:
Moin spelmann,

das würde ich anders beantworten als sheel.

Die Frage "Lösche ich täglich den Inhalt der Datenbank und schreibe alle Datensätze neu, oder ist es sinnvoll nur geänderte Datensätze zu aktualisieren?" ist doch abhängig davon
a) ob du "geänderte Datensätze" überhaupt ohne Aufwand erkennen kannst. Wenn die DS in dem Import einen Zeitstempel für das letzte Änderungsdatum haben, dann ist sicherlich eine Delta-Datenübernahme sinnvoll. Schon allein, weil sich von 2500 Datensätzen wahrscheinlich nur 3 pro Tag ändern.
Und die Performance von "3 Datensätze neu anlegen oder aktualisieren" vs. "2500 Datensätze löschen + 2500 Datensätze neu inserten" ist relativ eindeutig vergleichbar.

b) Weiterhin ist es abhängig davon, ob du beiden Datensätzen auch referentielle Integrität hast - also ob die importierten auch irgendwelche Childdatensätze haben oder nicht. Ich kann deine "ca. je 20 Knoten" nicht recht einschätzen, hört sich für mich aber nach Childsätzen an.
In diesem Fall ist ein "Leeren" der Tabellen doch fachlich ohnehn Quark - dann hast du doch jeden Tag immer wieder nur eine Momentaufnahme, einen Snapshot eines Zustands, wie er zum Zeitpunkt des Exports mal kurz in der Quelle war. Kannst du dafür nicht live (via bereitgestellter Nur-Lese-Views) direkt die Daten der Quelle anzeigen?

c) wenn du die Daten "übernehmen" musst aus technischen Gründen: - Ist es dann nicht sinnvoller, auch eine Historie mitzupflegen?`Wenn du nur Deltadaten übernimmst (was ich ja oben empfohlen habe), dann musst ja nicht nur neue Datensätze inserten und vorhandene aktualisieren, sondern auch Datensätze lösche, die "gestern noch" in der Quelle vorhanden waren, heute aber nicht mehr dabei sind. D.h. das kannst du am stressärmsten ja über ein GUELTIG_VON / GUELTIG_BIS Datum nmachen. Dabnn hätte dein Datenimport wenigstens auch einen gewissen Mehrwert ggü. der Quelle.

Grüße
Biber
 
Zurück