Per ottenere le voci in un determinato mese, per un determinato anno, più velocemente, necessità di indicizzare il time
colonna
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Inoltre, usa:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...perché BETWEEN è inclusivo, quindi otterresti qualsiasi cosa datata "2010-05-01 00:00:00" con la query che hai pubblicato.
Vorrei anche selezionare i dati di un determinato mese da un determinato DataSourceID
Puoi aggiungere un indice separato per la colonna datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...oppure imposta un indice di copertura per includere entrambe le colonne:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Un indice di copertura richiede che le colonne più a sinistra debbano essere utilizzate nella query per utilizzare l'indice. In questo esempio, avendo time
prima funzionerà per entrambe le situazioni che hai menzionato:datasourceid non deve essere utilizzato affinché l'indice sia utile. Ma devi testare le tue query visualizzando l'output di EXPLAIN per sapere davvero cosa funziona meglio per i tuoi dati e le query eseguite su quei dati.
Detto questo, gli indici rallenteranno le istruzioni INSERT, UPDATE e DELETE. E un indice non fornisce molto valore se i dati della colonna hanno pochi valori distinti - IE:una colonna booleana è una cattiva scelta da indicizzare, perché la cardinalità è bassa.