de.comp.lang.php.* FAQ

17.7. Wie lösche ich alle Datensätze, die älter als n Tage sind?

Antwort von Kristian Köhntopp

Die betreffende Tabelle sollte ein Datumsfeld haben, etwa ein selbstaktualisierendes Feld vom Typ TIMESTAMP oder ein manuell aktualisiertes Feld vom Typ DATE. Die folgenden drei Queries löschen jeweils alle Datensätze, die älter als 30 Tage sind, mit steigender Effizienz.

1. DELETE
       FROM kalender AS k
      WHERE (to_days(current_date) - to_days(k.datum)) > 30

2. DELETE
       FROM kalender AS k
      WHERE to_days(k.datum) < to_days(current_date)-30;

3. DELETE
       FROM kalender AS k
      WHERE k.datum < date_add(current_date, interval -30 day)

Die erste Query ist vergleichsweise langsam, denn hier ist die linke Seite der Query ein Ausdruck, der für jede Zeile berechnet werden muss. Der Spaltenname k.datum taucht auf der linken Seite in einer Funktionsanwendung auf, sodass keine Indizes angewendet werden können.

Die zweite Query ist insofern optimiert, als dass der konstante Teil der Rechnung auf die rechte Zeit gebracht werden kann, sodass diese Seite der Ungleichung zu einer Konstanten optimiert werden kann. Die linke Seite der Query ist jedoch noch immer eine Funktionsanwendung, sodass ein full table scan notwendig ist.

Die dritte Query ist durchoptimiert: Hier ist die linke Seite der Ungleichung ein reiner Spaltenausdruck, die rechte Seite zu einer Konstanten optimierbar. Wenn ein INDEX(k.datum) existiert, kann er in dieser Query angewendet werden, um den Zugriff zu beschleunigen.

Valid HTML 4.01! Valid CSS!

17.7. Wie lösche ich alle Datensätze, die älter als n Tage sind?
http://www.php-faq.de/q/q-mysql-loeschen.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team