У меня есть таблица уведомлений, содержащая около 100 миллионов строк хоста в Amazon RDS с 1000 IOPS, и я хочу удалить эти строки старше одного месяца.
Если я это сделаю DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
, все IOPS будут приняты, процесс займет несколько часов, и много новых записей не могут быть вставлены из-за «Превышено время ожидания блокировки; попробуйте перезапустить транзакцию».
Я пытался сделать так, как описано здесь: http://mysql.rjweb.org/doc.php/deletebig Однако я использую UUID вместо ID приращения.
Как правильно и эффективно удалить эти строки, не влияя на добавление / обновление новых данных?
Ответы:
Создайте временную таблицу, включите и выключите ее и скопируйте в нее данные за последние 30 дней.
В нерабочее время бросьте старый стол
Вот преимущества этого УДАЛЕНИЯ, как это
NOTIFICATION
быстро опорожняется путем переключения в пустую таблицу.NOTIFICATION
немедленно доступен для новых вставокNOTIFICATION
то время как новые INSERT могут иметь место.NOTIFICATION
не мешает новым INSERTПопробуйте!
источник
ALTER TABLE ENGINE=InnoDB
чтобы уменьшить таблицу.Мой любимый это pt-archiver от Percona Toolkit. Он заботится о загрузке MySQL, задержке репликации.
источник
создать таблицу уведомлений_темпов как выберите * из уведомления, где CreatedAt <DATE_SUB (CURDATE (), ИНТЕРВАЛ 30 дней);
уведомление об удалении таблицы;
ПЕРЕИМЕНОВАТЬ извещение_повестку В УВЕДОМЛЕНИЕ;
источник
CREATE TABLE
пропуска.RENAME TABLE notification_temp ...