Dirk Deimeke am :
Danke Malte!
Danke Malte!
:)
Funktioniert es bei dir, oder hattest du den Index sowieso schon erstellt?
Ich habe mich noch nicht an die grossen Tabellen getraut ...
Außer einem Timeout sollte da an sich wenig passieren.
Stimmt, die Tabelle (und damit das Blog) ist für die Zeit bis zum Timeout blockiert und dann noch die Zeit bis der Rollback fertig ist.
Das ist nicht gut.
Aus diesem Grund hatte ich das "Paketweise löschen" vorgeschlagen.
Könnte man mal wieder mit Limit probieren. Macht potentiell das ganze aber eher langsamer.
In wie fern langsamer? Du brauchst mehrere Anläufe, um komplett zu bereinigen, klar. Aber sonst?
Ich müsste ja erstmal herausfinden, wie viele Elemente ich löschen muss. Das kann ich bei einem DELETE FROM table WHERE time < $time sparen. Bei Paketweise wäre das ja:
$amount = SELECT COUNT(*) FROM table WHERE time < $time
while $amount > 0 {
DELETE FROM table WHERE time < $time LIMIT 10000
$amount -= 10000
}
Ach so, nein, das würde ich anders machen.
Auf der Übersichtsseite für alle Tabellen:
$amount = SELECT COUNT(*) FROM table WHERE time < $time
$total = SELECT COUNT(*) FROM table
Bei der Entscheidung zu bereinigen:
DELETE FROM table WHERE time < $time LIMIT 10000
Sonst macht das ja keinen Sinn, dann ist das Blog deutlich länger blockiert als gewollt.
Sodass bei jeder Benutzereingabe nur 10k Einträge gelöscht werden, man das also für 100k zehnmal aufrufen müsste?
Vielleicht liesse sich sogar noch die maximal in einem Rutsch zu löschenden Artikel eingeben.
Wenn ich das nachts machen würde, könnte ich alle Artikel in einem Rutsch löschen. Tagsüber würde ich dann eben über 10 Tage täglich ein paar Artikel löschen ...
Das gefällt mir nicht. Ich sehe nicht wie man das im Interface gut machen könnte, und einfach so nicht alles zu löschen ist für einen Nutzer komplett unerwartet.
Die einzige Lösung, die ich für mysql sehe, ist den Index zu erstellen. Entweder in Serendipity - das wäre aber eine andere Baustelle - oder mit einer temporären Tabelle. Hm, oder den Index erstellen und wieder entfernen, wenn das problemlos geht.
Das Problem ist am Ende der Timeout.
Wenn der zuschlägt, kannst Du die Tabelle nie bereinigen.
Auch das Erzeugen eines Indexes und Löschen nach der Aktion braucht auf einer grossen Tabelle Zeit.