Eliminar grandes cantidades (4 millones de filas) de datos mysql de manera eficiente, de manera muy regular


10

Tenemos una tabla mysql que en cualquier momento tiene aproximadamente 12 millones de filas. Necesitamos eliminar datos antiguos para mantener el tamaño de la tabla algo manejable.

En este momento estamos ejecutando esta consulta diariamente, a medianoche, usando un trabajo cron:

DELETE FROM table WHERE endTime < '1393632001'

La última vez que se ejecutó la consulta examinó 4,602,400, tomó más de 3 minutos y la CPU se disparó.

CPU subiendo a medianoche

¿Qué podemos hacer para evitar que la CPU, las conexiones db síncronas, la profundidad de referencia del disco, etc., se disparen sin razón mientras se borran los datos antiguos?

PD: Notará que la consulta realmente está ocurriendo en un momento bastante inoportuno en nuestro ciclo de uso. Suponga que ya hemos cambiado el tiempo de la consulta para que ocurra en el punto de uso más bajo cada día. Además, no hay ningún índice en "endTime" y preferiría mantenerlo de esa manera si es posible porque hay una tonelada de datos que se insertan con mucha regularidad y no hay mucha búsqueda.

php  mysql 

tal vez Use trabajos cron para eliminar cada 10 minutos y 100k por ronda o cada 5 minutos 50k por ronda

trozos más pequeños de forma más regular?

ok, pero parece que eso podría paralizar nuestra experiencia de usuario por períodos de tiempo más largos :) ¿Hay algo que podamos hacer en cuanto a consulta / diseño?

1
186k usuarios, ¿no hay un tipo de db dedicado?

1
Obtendrá mejores respuestas sobre "Administradores de bases de datos"
James Anderson

Respuestas:


13

La solución a su problema es una capacidad de MySQL llamada "particionamiento". La documentación está aquí .

Lo que hace la partición es almacenar una sola tabla en "particiones" separadas. Estos se definen por una expresión particular, generalmente un valor o rango de columna. En su caso, esto probablemente se basaría en endTime, suponiendo que se sabe cuando se crea un registro y no cambia.

Almacenaría el valor de un día endTimeen cada partición. Luego, el paso de eliminación sería truncar una partición en lugar de eliminar un montón de filas en una tabla grande. El truncamiento de la partición sería un método mucho más rápido.


wow, eso fue increíblemente útil, y parece una solución perfecta. ¡Es hora de leer sobre particiones! ¡Gracias!

Aunque la partición puede ser una buena solución, tenga cuidado con los gastos generales, puede ralentizar significativamente sus consultas. Además la tabla truncada tampoco es instantánea. Consideraría pt-archiver. Puede resolver sus problemas con picos y mantener su mesa tan simple como es ahora
akuzminsky
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.