For at få poster i en bestemt måned, for et bestemt år, hurtigere - du vil behov for at indeksere time
kolonne
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Brug desuden:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...fordi BETWEEN er inklusiv, så du får alt dateret "2010-05-01 00:00:00" med den forespørgsel, du sendte.
Jeg vil også gerne vælge data fra en bestemt måned fra et givet DataSourceID
Du kan enten tilføje et separat indeks for datakildeid-kolonnen:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...eller opsæt et dækkende indeks til at inkludere begge kolonner:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Et dækkende indeks kræver, at kolonnerne længst til venstre skal bruges i forespørgslen, for at indekset kan bruges. I dette eksempel har time
first vil virke i begge situationer, du nævnte -- datasourceid behøver ikke at blive brugt for at indekset kan bruges. Men du skal teste dine forespørgsler ved at se EXPLAIN-outputtet for virkelig at vide, hvad der fungerer bedst for dine data og de forespørgsler, der udføres på disse data.
Når det er sagt, vil indekser bremse INSERT-, UPDATE- og DELETE-udsagn. Og et indeks giver ikke megen værdi, hvis kolonnedataene har få distinkte værdier - IE:en boolsk kolonne er et dårligt valg at indeksere, fordi kardinaliteten er lav.