Was ist der beste Ansatz, um eine DELETE-Abfrage für 92 KB mit 4 Millionen Zeilen auszuführen?

7

Optionen, die mir eingefallen sind:

  1. Eine große Löschanweisung. Zum Beispiel:

    delete from x where (y = 'x' and x = 'y') or (y = 'a' and x = 'b')
  2. Wie oben, aber in kleinere Stücke geteilt, jeweils 10.000?

  3. Erstellen Sie eine gespeicherte Prozedur, sodass ich nur die beiden Abfragewerte sende.

Lee Hinde
quelle

Antworten:

8

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 TABLEmöglicherweise keine schlechte Idee. Tun Sie dies jedoch nicht während der Stoßzeiten.

Simon Righarts
quelle
4

Ich würde immer DELETE QUICKstatt nur verwenden DELETE, da es beim Löschen weniger mit den Indizes funktioniert, und zu einem späteren Zeitpunkt, wenn Sie die Möglichkeit haben, die Tabelle zu optimieren, werden die zurückgelassenen Indexblätter gesammelt.

Ich würde auf jeden Fall empfehlen, die Dokumentation weiterzulesen, um DELETE QUICKzu sehen, ob dies hilfreich ist.

http://dev.mysql.com/doc/refman/5.5/en/delete.html

Dave Rix
quelle
1
Ich mag DELETE QUICKMyISAM (in Ihrem Link angegeben), weil es das tut, was OPTION 2 in meiner Antwort tut. +1 !!!
RolandoMySQLDBA
2

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.

Rob Farley
quelle