Eu tenho uma tabela de notificação que contém cerca de 100 milhões de linhas hospedadas no Amazon RDS com 1000 IOPS e desejo excluir essas linhas com mais de um mês.
Se o fizer DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
, todas as IOPS serão realizadas, o processo levará horas e muitas entradas novas não poderão ser inseridas devido a "Tempo limite de espera de bloqueio excedido; tente reiniciar a transação".
Eu estava tentando fazer a maneira descrita aqui: http://mysql.rjweb.org/doc.php/deletebig No entanto, estou usando UUID em vez de ID de incremento.
Qual é a maneira correta e eficiente de excluir essas linhas sem afetar a inserção / atualização de novos dados?
Respostas:
Crie uma tabela temporária, ligue e desligue e copie os dados dos últimos 30 dias nela.
Nas horas de folga, largue a mesa antiga
Aqui estão as vantagens de fazer DELETEs como este
NOTIFICATION
é esvaziado rapidamente, alternando uma tabela vazia.NOTIFICATION
está disponível imediatamente para novos INSERTsNOTIFICATION
enquanto novos INSERTs podem ocorrer.NOTIFICATION
não interfere com os novos INSERTsDe uma chance !!!
fonte
ALTER TABLE ENGINE=InnoDB
para reduzir a tabela.O meu favorito é o pt-archiver do Percona Toolkit. Ele cuida da carga do MySQL, atraso na replicação.
fonte
crie a tabela notification_temp como selecione * da notificação em que CreatedAt <DATE_SUB (CURDATE (), INTERVAL 30 dias);
notificação de descartar tabela;
RENAME notification_temp TO NOTIFICATION;
fonte
CREATE TABLE
são perdidos.RENAME TABLE notification_temp ...