Tengo una tabla de notificaciones que contiene alrededor de 100 millones de filas de host en Amazon RDS con 1000 IOPS, y quiero eliminar esas filas de más de un mes.
Si lo hago DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
, se tomarán todos los IOPS, el proceso tomará horas y no se pueden insertar muchas entradas nuevas debido a que "Se excedió el tiempo de espera de bloqueo; intente reiniciar la transacción".
Estaba tratando de hacer la forma descrita aquí: http://mysql.rjweb.org/doc.php/deletebig Sin embargo, estoy usando UUID en lugar de ID de incremento.
¿Cuál es la forma correcta y eficiente de eliminar esas filas sin afectar la inserción / actualización de nuevos datos?
Respuestas:
Haga una tabla temporal, enciéndala y extráigala, y copie los datos de los últimos 30 días.
En tus horas libres, deja caer la vieja mesa
Aquí están las ventajas de hacer DELETEs como este
NOTIFICATION
se vacía rápidamente mediante el cambio en una tabla vacía.NOTIFICATION
está disponible de inmediato para nuevos INSERTNOTIFICATION
mientras se pueden realizar nuevos INSERT.NOTIFICATION
no interfiere con los nuevos INSERTDarle una oportunidad !!!
fuente
ALTER TABLE ENGINE=InnoDB
y reducir la tabla.Mi favorito es pt-archiver de Percona Toolkit. Se encarga de la carga de MySQL, el retraso de replicación.
fuente
cree la tabla notificación_temp como select * desde la notificación donde CreatedAt <DATE_SUB (CURDATE (), INTERVAL 30 day);
notificación de caída de tabla;
NOMBRAR notificación_temp A NOTIFICACIÓN;
fuente
CREATE TABLE
se pierden.RENAME TABLE notification_temp ...