8

Ho una grande tabella con 22 milioni di record. Voglio eseguire query successiva:Query MySQL per data con grande inverval

select auto_alerts from alerts_stat where endDate > "2012-12-01" 

Per migliorare le prestazioni ho aggiunto indice BTREE per EndData campo:

CREATE INDEX endDate_index USING BTREE ON alerts_stat(endDate) 

Dopo comincio ad analizzare piano di esecuzione di query:

Quando voglio ottenere parametri da 15 a 7 giorni prima:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 7; 

Ho ottenuto il prossimo piano di esecuzione per elaborare 2.762.088 righe.

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'range', 'endDate_index', 'endDate_index', '4', NULL, '2762088', 'Using where' 

Quando ho aumentare l'intervallo di un giorno, ho ricevuto:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 6; 

spiegare detto piano MySQL elaborare tutti 22,923,126 righe.

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'ALL', 'endDate_index', NULL, NULL, NULL, '22932390', 'Using where' 

Ad esempio selezionare senza condizioni nel processo WHERE 22.925.642.

Posso migliorare il piano di esecuzione? Forse ho un errore da qualche parte, o il normale comportamento di MySQL?

risposta

3

Quando il set di risultati supera l'8-9% di tutte le righe, MySQL esegue la scansione completa della tabella. Per me, sembra che un giorno si aggiungano oscillazioni MySQL in piena direzione di scansione della tabella. Si potrebbe provare a forzare l'indice per vedere se il risultato è migliore.

UPDATE:

Da quello che ho letto, query MySQL ottimizzatore tende a scegliere il male in casi limite come questo, in modo che possa facilmente lavorare meglio forzando un indice. Altrimenti, questa è una query semplice e non ho molto spazio per l'ottimizzazione.

Forse creare uno Covering index su queste due colonne e forzarne l'utilizzo potrebbe dare i migliori risultati.

+0

Grazie. Penso che sia il mio caso. Quindi è un comportamento specifico di MySQL. Posso migliorare la query in qualche modo per ottenere la somma di esempio ('alerts_sp') ​​per un grande intervallo? – Taky