2012-02-02 9 views
6

Ho una tabella che riceve centinaia di richieste al minuto. Il problema che sto avendo è che ho bisogno di un modo per selezionare solo le righe che sono state inserite negli ultimi 5 minuti. Sto provando questo:Seleziona righe meno di 5 minuti utilizzando DATE_SUB

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

Il mio problema è che restituisce 70k + risultati e conteggio. Non sono sicuro di cosa stia sbagliando, ma mi piacerebbe avere qualche aiuto su questo. Inoltre, se ci fosse un modo per raggrupparli per minuto per avere sembrare:

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

Mi piacerebbe l'aiuto e la direzione su questo, quindi per favore fatemi sapere i vostri pensieri.

+0

Qual è il tipo di 'colonna timestamp'? – Tadeck

+0

@tadeck è un datetime, farebbe la differenza? –

+3

Fa una grande differenza, dato che alcune persone usano 'INT' per memorizzare i timestamp. Inoltre si differenzia dal tipo 'TIMESTAMP', perché' DATETIME' è trattato letteralmente e non si adatta al fuso orario. Questo potrebbe essere il problema: confronta il timestamp della voce inserita di recente con il risultato di "SELECT NOW();" e facci sapere i valori di entrambi. – Tadeck

risposta

2

Di seguito sembra che avrebbe funzionato, che è potente vicino a quello che si ha:

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 colonna aggiunto per mostrare al minuto e la clausola GROUP BY che raccoglie i risultati nel corrispondente minuto. Immagina di avere 5 piccoli secchi etichettati con gli ultimi 5 minuti. Ora immagina di aver gettato ogni fila che era vecchia di 4 minuti nel proprio secchio. count() conterrà quindi il numero di voci trovate in ciascun bucket. Questa è una rapida visualizzazione su come funziona GROUP BY. http://www.tizag.com/mysqlTutorial/mysqlgroupby.php sembra essere una discreta recensione su GROUP BY se hai bisogno di maggiori informazioni.

Se si esegue quello e il numero di voci in ogni minuto sembra troppo alto, si vorrà fare un po 'di risoluzione dei problemi. Prova a sostituire COUNT (id) con MAX (date_field) e MIN (date_field) in modo da farti un'idea del tipo di date che sta catturando. Se MIN() e MAX() sono all'interno dell'intervallo, potresti avere più dati scritti nel tuo database di quanto tu non creda.

Si potrebbe anche ricontrollare che non si hanno date in futuro come sarebbero tutti> ora(). I controlli MIN()/MAX() menzionati sopra dovrebbero identificare anche questo se si tratta di un problema.

+0

Risposta ben scritta – phpmeh

10

Non avete davvero bisogno DATE_ADD/DATE_SUB, data l'aritmetica è molto più semplice:

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 
Problemi correlati