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.

hosted by
schlund + partner

Valid HTML 4.01! Valid CSS!

17.7. Wie lösche ich alle Datensätze, die älter als n Tage sind?
http://www.dclp-faq.de/q/q-mysql-loeschen.html
de.comp.lang.php FAQ | (c) Copyright 2000-2003 Das dclp-FAQ-Team