Ich habe eine Benachrichtigungstabelle, die ungefähr 100 Millionen Zeilen enthält, die in Amazon RDS mit 1000 IOPS gehostet werden, und ich möchte diese Zeilen löschen, die älter als ein Monat sind.
In DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
diesem Fall werden alle IOPS ausgeführt, der Vorgang dauert Stunden, und viele neue Einträge können nicht eingefügt werden, da "Wartezeit für Sperren überschritten wurde. Versuchen Sie, die Transaktion neu zu starten".
Ich habe versucht, die hier beschriebene Vorgehensweise zu verwenden: http://mysql.rjweb.org/doc.php/deletebig Ich verwende jedoch die UUID anstelle der Inkrement-ID.
Was ist der richtige und effiziente Weg, um diese Zeilen zu löschen, ohne dass das Einfügen / Aktualisieren neuer Daten beeinträchtigt wird?
Antworten:
Erstellen Sie eine temporäre Tabelle, schalten Sie sie ein und aus und kopieren Sie die Daten der letzten 30 Tage hinein.
Lassen Sie in Ihrer Freizeit den alten Tisch fallen
Hier sind die Vorteile solcher DELETEs
NOTIFICATION
wird durch Umschalten in eine leere Tabelle schnell geleert.NOTIFICATION
ist ab sofort für neue INSERTs verfügbarNOTIFICATION
während neue INSERTs stattfinden können.NOTIFICATION
Löschen der alten Version von beeinträchtigt neue INSERTs nichtVersuche es !!!
quelle
Mein Favorit ist pt-archiver von Percona Toolkit. Es kümmert sich um MySQL-Last, Replikationsverzögerung.
quelle
Erstellen Sie die Tabelle notification_temp als select * aus Benachrichtigung, wobei CreatedAt <DATE_SUB (CURDATE (), INTERVAL 30 Tage);
Drop-Table-Benachrichtigung;
RENAME notification_temp TO NOTIFICATION;
quelle
CREATE TABLE
werden übersehen.RENAME TABLE notification_temp ...