2012-02-02 6 views
6

Tengo una tabla que recibe cientos de solicitudes por minuto. El problema que estoy teniendo es que necesito una forma de seleccionar solo las filas que se han insertado en los últimos 5 minutos. Estoy intentando esto:Seleccionar filas que tienen menos de 5 minutos de antigüedad con DATE_SUB

SELECT count(id) as count, field1, field2 
FROM table 
WHERE timestamp > DATE_SUB(NOW(), INTERVAL 5 MINUTE) 
ORDER BY timestamp DESC 

Mi problema es que devuelve 70k + resultados y contando. No estoy seguro de qué es lo que estoy haciendo mal, pero me gustaría obtener algo de ayuda sobre esto. Además, si hubiera una manera de agruparlos por minuto para que se vea como:

| count | field1 | field2 | 
---------------------------- 

me gustaría la ayuda y la dirección en esto, así que por favor, hágamelo saber sus pensamientos.

+0

¿Cuál es el tipo de columna 'timestamp'? – Tadeck

+0

@tadeck es una fecha y hora, ¿eso marcaría la diferencia? –

+3

Hace la gran diferencia, ya que algunas personas usan 'INT' para almacenar marcas de tiempo. También difiere del tipo 'TIMESTAMP', porque' DATETIME' se trata literalmente y no se ajusta para la zona horaria. Este puede ser el problema: compare la marca de tiempo de la entrada insertada recientemente con el resultado de 'SELECCIONAR AHORA();' y háganos saber acerca de los valores de ambos. – Tadeck

Respuesta

2

El siguiente parece que sería funcionaba, que es poderoso cerca de lo que tenía:

SELECT 
    MINUTE(date_field) as `minute`, 
    count(id) as count 
FROM table 
WHERE date_field > date_sub(now(), interval 5 minute) 
GROUP BY MINUTE(date_field) 
ORDER BY MINUTE(date_field); 

Nota la columna añadido para mostrar la hora y el GRUPO POR cláusula que recoge los resultados en el acta correspondiente. Imagine que tiene 5 cubos pequeños etiquetados con los últimos 5 minutos. Ahora imagina que arrojaste cada hilera que tenía 4 minutos de antigüedad en su propio cubo. count() contará el número de entradas encontradas en cada segmento. Esa es una visualización rápida de cómo funciona GROUP BY. http://www.tizag.com/mysqlTutorial/mysqlgroupby.php parece ser una descripción decente en GROUP BY si necesita más información.

Si ejecuta eso y el número de entradas en cada minuto parece demasiado alto, querrá solucionar el problema. Intente reemplazar COUNT (id) por MAX (date_field) y MIN (date_field) para que pueda hacerse una idea del tipo de fechas que está capturando. Si MIN() y MAX() están dentro del rango, puede tener más datos escritos de lo que cree en su base de datos.

También puede comprobar que no tenga fechas en el futuro ya que todas serían> ahora(). Los controles MIN()/MAX() mencionados anteriormente también deberían identificar eso si es un problema.

+0

Respuesta bien escrita – phpmeh

10

Usted realmente no necesita DATE_ADD/DATE_SUB, fecha de la aritmética es mucho más simple:

SELECT COUNT(id), DATE_FORMAT(`timestamp`, '%Y-%m-%d %H:%i') 
FROM `table` 
WHERE `timestamp` >= CURRENT_TIMESTAMP - INTERVAL 5 MINUTE 
GROUP BY 2 
ORDER BY 2 
Cuestiones relacionadas