Datensätze nach x Tagen aus Tabelle löschen
Andreas
- datenbank
Hallo,
ich möchte abgesendete eCards nur eine bestimmte Zeit zur Verfügung stellen. Ich könnte jetzt bei jedem laden der index-Seite eine Abfrage machen ob veralterte Datensätze enthalten.
Ist das nicht zu Performancelastig?
Vorallem, was ist wenn z.B. 1 Monate niemand die Startseite besucht?
Dann wird die Abfrage nicht ausgeführt.
Welche alternative Möglichkeiten habe ich sonst noch (Außer Cron-Jobs)?
Gruß Andreas
Hi,
Welche alternative Möglichkeiten habe ich sonst noch (Außer Cron-Jobs)?
warum schließt Du die ideale Methodik aus?
Cheatah
Hallo,
warum schließt Du die ideale Methodik aus?
Weil ich diese Methode bei dem Provider und diesem Paket nicht zur Verfügung habe. Sonst hätte ich es wohl mit einem Cron-Job gemacht.
@ Ludger: ich überlege ob ich zusätzlich im Administrationsbereich eine Option einbaue um genau dies zu tun, danke für die Anregung.
@ Tom: ja gute Idee, da ich eh nicht mit so vielen Grußkarten rechne, wird es auch der Performance keinen abbruch tun. Und außerdem ist es ja pro Grußkarte ein einmaliger Vorgang der den ganzen Vorgang imo nur unwesentlich, eher gar nicht, verlangsamt.
Gruß und Danke,
Andreas
Hello,
@ Tom: ja gute Idee, da ich eh nicht mit so vielen Grußkarten rechne, wird es auch der Performance keinen abbruch tun. Und außerdem ist es ja pro Grußkarte ein einmaliger Vorgang der den ganzen Vorgang imo nur unwesentlich, eher gar nicht, verlangsamt.
Um das nochmals zu spezifizieren:
Delete from $tablename where $filter
ist die wohl kraftfressendste Anweisung an MySQL (gehe ich jetzt mal davon aus, dass Du das benutzt)
MySQL ist "vorwärtsoptimiert", d.h. dass es möglichst wenig Performance kosten darf, Datensätze hinzuzufügen und/oder zu verändern. Je mehr Indexe auf der Tabelle liegen, desto mehr muss MySQL leisten. Beim Löschen frisst das dann aber besonders viel Kraft.
Du würdest Dir also einen Gefallen tun, wenn Du das Konzept etwas änderst:
Jeder Datensatz bekommt eine zusätzliche Spalte für eine Löschmarkierung.
Jede Abfrage muss nun natürlich berücksichtigen, ob die gesetzt ist, oder nicht.
Das hat in großen Systemen (mit vielen unterschiedlich Berechtigten) auch noch den Vorteil, dass man auch noch registrieren könnte, wer die Daten "gelöscht" hat, bevor man die tatsächliche Beseitigung (z.B. einmal täglich) anstößt.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo,
bevor man die tatsächliche Beseitigung (z.B. einmal täglich) anstößt.
Das ist doch das Problem. Das kann ich nicht automatisieren da ich keine Cron-Jobs einsetzten kann.
Ich könnte dann z.B. ein Script erstellen, das bei jedem Zugriff prüft ob es 12:00 Mittags ist und dann die Abfrage absenden.
Aber, ist das denn nicht viel mehr Performance-lastiger als mit einer einfachen mysql_query("Delete From Tabelle1 Where datum < $pruefdatum"); - Anweisung, die dann genau dann abgesetzt wird, wenn jemand eine eCard schreibt.
Also wenn durchschnittlich 1x Pro Tag eine eCard abgeschickt wird, ist das imo sehr hochgegriffen.
Ich denke ich werde das so belassen.
Gruß und Danke für deine Antwort,
Andreas
Hello,
Ich könnte dann z.B. ein Script erstellen, das bei jedem Zugriff prüft ob es 12:00 Mittags ist und dann die Abfrage absenden.
Nein. Du könntest eine Funktion erstellen, die innerhalb der betroffenen Scripte (auch des Admin-Scriptes) feststellt, ob die Aufgabe schon erledigt ist, und die notwendigen Schritte sonst veranlasst.
Das ist dann eine Art eigener "Auto-Jobs". "Cron" wäre da das falsche Wort, da die Jobs nicht durch die Uhr, sondern durch einen Request ausgelöst werden.
Aber, ist das denn nicht viel mehr Performance-lastiger als mit einer einfachen mysql_query("Delete From Tabelle1 Where datum < $pruefdatum"); - Anweisung, die dann genau dann abgesetzt wird, wenn jemand eine eCard schreibt.
Also wenn durchschnittlich 1x Pro Tag eine eCard abgeschickt wird, ist das imo sehr hochgegriffen.
Solange es bei einer bleibt am Tag.
Es wäre aber doch trotzdem eine interessante Übung, wenn Du das System "vernünftig" programmierst, sodass es auch unter Last noch läuft.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo,
Es wäre aber doch trotzdem eine interessante Übung, wenn Du das System "vernünftig" programmierst, sodass es auch unter Last noch läuft.
OK, dann mach ich mich mal an die Fleissarbeit.
Gruß Andreas
Hi,
Vorallem, was ist wenn z.B. 1 Monate niemand die Startseite besucht?
Dann wird die Abfrage nicht ausgeführt.
Welche alternative Möglichkeiten habe ich sonst noch (Außer Cron-Jobs)?
manuelles Bearbeiten. Automatisierte Loesungen empfehlen sich nur, wenn sie robust sind und wenn die Anforderung (und damit auch die Konsequenzen der Umsetzung) klar ist.
Gruss,
Ludger
Hello,
am besten finde ich es immer, wenn man die DInge an _der_ Stelle regelt, an der sie auch wirken sollen. Dann kommt man später nicht durcheinander.
Wann und wodurch würden denn eCards angezeigt werden?
Genau an dieser Stelle baust Du eine kleine Abfrage ein, die das Löschen veranlasst. Damit es nicht jeden Besucher erwischt, und der auf den Ressourcenfresser "delete" läuft, kannst Du noch ein kleines Log mit einem Textfile oder eben auch in der DB führen, ob an diesem Tag (oder in dieser Stunde oder in dieser Woche ...) schon eine Löschaktion stattgefunden hat, und die delete-Aktion davon abhängig machen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom