Mysql
 sql >> Database >  >> RDS >> Mysql

60 milioni di voci, seleziona le voci di un determinato mese. Come ottimizzare il database?

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.