localer Spiegel einer externen Datenbank
-
guten tag
ich muss eine lokale datenbank jede stunde updaten. dazu bekomme ich vom server .csv files mit bis zu 300'000 einträgen. dies ist jeweils die komplette datensatz, und nicht blos die änderungen. wie kann ich nun am effektivsten die geänderten und neuen daten rausfinden?
ich verwende Java Persistence und Hibernate auf ner mySQL datenbank (eigentlich austauschbar) auf localhost. auf den server hab ich keinen einfluss.
danke im voraus
-
Warum setzt du lokal nicht einen MySQL Server auf der als Spiegel von dem anderen läuft?
-
ich habe keinen zugriff auf die db. (kommerziell)
kann lediglich per http die files runterladen. (oeffentlich)
die files enthalten die tables als listen (unsortiert!)id;feld1;feld2;feld3;
-
DIe geänderten Daten musst du nicht finden.
Es gibt den SQL-Befehl REPLACE.
Aber nur wenn du ein ordentliches DB-Design hast. (PK)
Was REPLACE macht siehst du in der DOC von MySQL.
-
ja den kenn ich, aber der ersetzt mir ja auch alle datensaetze, die keine änderung durchgemacht haben. das ist schrecklich langsam, dauert fast 10 minuten. (4 tables mit bis zu 500'000 einträgen).
das wollt ich gern umgehn.
-
- BULK INSERT in temp table (keine Ahnung wie das in mySQL geht)
- DELETE alle Zeilen wo sich nix geändert hat
- UPDATE alle Zeilen die noch übrig sind und bereits im "alten" table enthalten
- INSERT alle Zeilen die noch übrig sind und noch nicht im "alten" table enthalten
2, 3 und 4 natürlich mit einem einzigen statement für alle Zeilen. Wenn du transaktionale tables verwendest am besten alles in eine transaktion schmeissen.
Und guck mal da, da steheh einige Dinge wie man bei mySQL INSERTs schnell bekommt: http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html
Evtl. lassen sich ein paar dieser Dinge dann auch auf die nötigen UPDATE und DELETE umünzen. Oder vielleicht wird damit sogar das "dumme" INSERT über alle Daten schnell genug.
-
Falsch. Replace verändert nur wenn es auch was zum verändern gibt.
Letztlich muss man sowieso alle Daten miteinander vergleichen und 500000 mit Replace dauert sicher nicht 10 min.
Zumindest nicht auf meinen Servern hier.
Da gabs schon mehr Datensätze welche in kürzerer Zeit eingefügt wurden.
Kommt natürlich auf die Daten an.
Es ist aber auch Tatsache das sowas eine bestimmte Zeit braucht.