Tengo una tabla MySQL enorme, y crece alrededor de 90 filas por segundo, cada 4 horas se vierten 1,3 millones de filas allí con la marca de tiempo

user(varchar)   | created_at(timestamp)
----------------------------
user 1          | 2016-01-27 08:00:00
user 2          | 2016-01-27 08:00:00
user 3          | 2016-01-27 08:00:00
...
user 1          | 2016-01-27 12:00:00
user 2          | 2016-01-27 12:00:00

Etc ... ¿Cuál es el mejor enfoque para podar los datos de más de un mes para tener solo una fila por día?

Siempre hay filas a las 00:00, así que estaba pensando en algo como

created_at >= date + 00:00 and created_at < date + 19:59

O

select user, max(created_at) from table where created_at = date group by username

0
Adam 27 ene. 2016 a las 11:44

2 respuestas

La mejor respuesta

Bien, he tenido un poco de juego, así que publicaré esto para cualquier otra persona que desee eliminar sus datos.

created_at debe ser TIMESTAMP

delete from `table` where `created_at` < DATE_SUB(NOW(), INTERVAL 30 DAY) and HOUR(created_at) = 00

Esto eliminará todas las filas con la hora establecida en 00, pero si necesita más flexibilidad, puede hacerlo

delete from `table` where `created_at` < DATE_SUB(NOW(), INTERVAL 30 DAY) and HOUR(created_at) between 0 and 4
0
Adam 28 ene. 2016 a las 17:21

Para una cantidad tan grande de datos, es posible que desee usar particiones para administrar los datos, ya que ejecutar declaraciones de eliminación con filtro en tablas grandes puede llevar mucho tiempo. Cuando crea particiones por mes, eliminar una partición es muy rápido. Pero esto eliminará los datos de ese mes, por lo que es posible que deba almacenar el resumen del usuario en otra tabla antes de eliminar una partición.

0
slbteam08 27 ene. 2016 a las 09:41