MYSQL Delete NOT IN Tabelle gruppieren?

Cusco

Erfahrenes Mitglied
Hi,

Ich habe ein Counter-Tabelle welches mit einem Logfile abgeglichen werden soll. Aus dem Counter werden in regelmäßigen Abständen Einträge ab einen Datum gelöscht aber nur Einträge wo der Cookie nicht im Logfile vermerkt ist. Aber die Cookies von meinen eigenen Surfen mit gelöscht werden (IE und FireFox) egal welches Datum.
Ebenfalls soll der Eintrag mit dem Maximal Cookie erhalten bleiben.

Nun benötigt die Abfrage schon ca 5 Sekunden für 3000 Counter und 6000 Logfile- Einträgen mit nur 35 verschiedenen Cookies (Cookies werden erst seit kurzem im Logfile gespeichert)

Frage: ist es sinnvoll die Cookies des Logfiles bei NOT IN(Select ...) zu Gruppieren, damit die Cookies zusammen gefasst werden, oder sollte ich die Gruppierung weglassen, für die Maximale Geschwindigkeit.

Hier der aktuelle Query

Code:
"delete from `$dbtabelle_url` 
where `id`='$killcookie1' or `id`='$killcookie2' or 
(`surfdatum`<'$datum' and `id`<'$maxid' and 
  (`id` NOT IN(select `cookie` from `$dbtabelle_logfile` group by `cookie`))
)"

Wie könnte der Query string weiterhin optimiert werden?
 
Hi
anstatt group kannst du distinct nehmen:
SQL:
#anstatt das
select `cookie` from `$dbtabelle_logfile` group by `cookie`
#das
select distinct cookie from`$dbtabelle_logfile
Aber viel wird das nicht bringen.
Du kannst noch einen Index auf Id und cookie legen um den Vergleich schneller zu haben (Was schon mehr bringen wird).
Ansonsten kannst du nicht mehr viel machen. Wenn es immer noch zu langsam ist müsstest du die logic überdenken und das Löschen vielleicht anders realisieren.

Gruss
 
Hi
anstatt group kannst du distinct nehmen:
SQL:
#anstatt das
select `cookie` from `$dbtabelle_logfile` group by `cookie`
#das
select distinct cookie from`$dbtabelle_logfile
Aber viel wird das nicht bringen.
Du kannst noch einen Index auf Id und cookie legen um den Vergleich schneller zu haben (Was schon mehr bringen wird).
Ansonsten kannst du nicht mehr viel machen. Wenn es immer noch zu langsam ist müsstest du die logic überdenken und das Löschen vielleicht anders realisieren.

Gruss

Stimmt distinct wäre wohl besser daran habe ich gar nicht gedacht. Auf die Idee mit den Index bin ich vorhin auch noch gekommen und habe das Logfile-cookie als index definiert, die id von der Counter-Tabelle war schon als Primary eingetragen. Übrigens um so älter das Datum umso schneller funktionierte der Löschvorgang. Kann es sein das MySql die Bedingungen der reihe nach prüft wie sie dort angegeben sind? So das Bedingungen die am häufigsten oder schnellsten überprüft werden können bzw. zutreffen, man an den Anfang setzen sollte?
 
Hmm ich glaub distinct ist wirklich besser als group, ich habe gerade einen Test gemacht, obwohl kein Eintrag gelöscht wurde, da das Datum zu gering ist, war die Routine gleich etwas schneller, als beim gleichen Test mit der alten Variante. :)
 
Kann es sein das MySql die Bedingungen der reihe nach prüft wie sie dort angegeben sind? So das Bedingungen die am häufigsten oder schnellsten überprüft werden können bzw. zutreffen, man an den Anfang setzen sollte?
Das habe ich mich auch schon gefragt. So viel ich weiss macht MySQL Short-Circuit-Evaluation, D.h. es checkt alle Bedingeungen und sofern eine unwahr ist geht MySQL gleich zum nächsten Datensatz und prüft den vorigen nicht mehr fertig. Möglich wäre natürlich dass MySQL die Reihenfolge optimiert, aber glaube ich eher nicht (Vorallem ist es gar nicht soo einfach die Bedingungen automatisiert umzusortieren).


Gruss
 
Zurück