92K von 4M sind immer noch nur 2,3% Ihrer Datensätze. Ich würde Ihre erste Option vorschlagen, werfen Sie einfach das, was Sie löschen möchten, in die Datenbank und lassen Sie die Datenbank es sortieren (wenn Sie es der Datenbank auf einmal geben, ist es wahrscheinlich effizienter, als wenn Sie es paketieren aus). Ich würde nur empfehlen, es zu blockieren, wenn Ihre Anwendung zeitkritisch ist und Sie sich Sorgen machen, sie zu verlangsamen (in diesem Fall besteht die andere Lösung darin, sie außerhalb der Geschäftszeiten auszuführen).
Wenn Sie 20 bis 30% oder mehr der Datensätze aus der Tabelle entfernt haben, würde ich empfehlen, Indizes zu löschen, zu löschen und Indizes neu zu erstellen, gefolgt von einem OPTIMIZE TABLE
, aber für 2% der Datensätze in der Tabelle wird der Index neu erstellt Overhead lohnt sich nicht (es ist schneller, die Indizes beim Löschen der Datensätze auf dem neuesten Stand zu halten).
Nach dem Löschen ist das Ausführen OPTIMIZE TABLE
möglicherweise keine schlechte Idee. Tun Sie dies jedoch nicht während der Stoßzeiten.
DELETE QUICK
MyISAM (in Ihrem Link angegeben), weil es das tut, was OPTION 2 in meiner Antwort tut. +1 !!!Sie möchten sicherstellen, dass Ihr Plan versucht, die Aufzeichnungen von Interesse zu finden. Lassen Sie es also zuerst als SELECT mit den entsprechenden Indizes gut laufen.
Wenn das Sperren bei der Ausführung der DELETEs schmerzhaft ist, tun Sie dies in Stapeln. Wenn Ihre Abfrage jedoch die Tabelle scannt, führt die Verwendung von Stapeln dazu, dass die Tabelle mehrmals gescannt wird.
quelle