J'ai une table de notification contenant environ 100 millions de lignes d'hôte dans Amazon RDS avec 1000 IOPS, et je souhaite supprimer ces lignes de plus d'un mois.
Si je le fais DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
, tous les IOPS seront pris, le processus prendra des heures et de nombreuses nouvelles entrées ne pourront pas être insérées en raison de "Délai d'attente de verrouillage dépassé; essayez de redémarrer la transaction".
J'essayais de faire la manière décrite ici: http://mysql.rjweb.org/doc.php/deletebig Cependant, j'utilise UUID au lieu d'incrémenter l'ID.
Quelle est la manière correcte et efficace de supprimer ces lignes sans affecter les nouvelles données insérées / mises à jour?
Réponses:
Créez une table temporaire, activez-la, puis copiez-y les données des 30 derniers jours.
Pendant vos heures de repos, laissez tomber l'ancienne table
Voici les avantages de faire DELETE comme ça
NOTIFICATION
est vidé rapidement en basculant dans une table vide.NOTIFICATION
est immédiatement disponible pour les nouveaux INSERTNOTIFICATION
tandis que de nouveaux INSERT peuvent avoir lieu.NOTIFICATION
n'interfère pas avec les nouveaux INSERTEssaie !!!
la source
ALTER TABLE ENGINE=InnoDB
.Mon préféré est pt-archiver de Percona Toolkit. Il prend en charge la charge MySQL, le retard de réplication.
la source
créer la table notification_temp comme sélectionnez * à partir de la notification où CreatedAt <DATE_SUB (CURDATE (), INTERVAL 30 jours);
notification de table de dépôt;
RENOMMER notification_temp TO NOTIFICATION;
la source
CREATE TABLE
sont manqués.RENAME TABLE notification_temp ...