För att få bidrag under en viss månad, för ett visst år, snabbare - du måste indexera time
kolumn
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Använd dessutom:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...eftersom BETWEEN är inkluderande, så du får allt daterat "2010-05-01 00:00:00" med den fråga du postade.
Jag skulle också vilja välja data från en viss månad från ett givet DataSourceID
Du kan antingen lägga till ett separat index för kolumnen datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...eller ställ in ett täckande index för att inkludera båda kolumnerna:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Ett täckande index kräver att kolumnerna längst till vänster måste användas i frågan för att indexet ska användas. I det här exemplet har time
first kommer att fungera för båda situationerna du nämnde -- datasourceid behöver inte användas för att indexet ska vara användbart. Men du måste testa dina frågor genom att titta på EXPLAIN-utdata för att verkligen veta vad som fungerar bäst för din data och de frågor som utförs på den datan.
Som sagt, index kommer att sakta ner INSERT-, UPDATE- och DELETE-satser. Och ett index ger inte mycket värde om kolumndata har få distinkta värden - IE:en boolesk kolumn är ett dåligt val att indexera, eftersom kardinaliteten är låg.