Chcete-li získat záznamy v konkrétním měsíci, pro konkrétní rok, rychleji – budete potřebujete indexovat time
sloupec
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Dále použijte:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...protože BETWEEN je zahrnut, takže s dotazem, který jste zveřejnili, byste dostali cokoliv s datem "2010-05-01 00:00:00".
Rád bych také vybral data z určitého měsíce z daného DataSourceID
Můžete buď přidat samostatný index pro sloupec datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...nebo nastavte krycí index tak, aby zahrnoval oba sloupce:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Krycí index vyžaduje, aby byly v dotazu použity sloupce zcela vlevo, aby byl index použit. V tomto příkladu s time
první bude fungovat pro obě situace, které jste zmínili - datasourceid nemusí být použito, aby byl index užitečný. Musíte však své dotazy otestovat zobrazením výstupu EXPLAIN, abyste skutečně věděli, co pro vaše data a dotazy prováděné na tato data funguje nejlépe.
To znamená, že indexy zpomalí příkazy INSERT, UPDATE a DELETE. A index neposkytuje velkou hodnotu, pokud data ve sloupci mají málo odlišných hodnot - IE:booleovský sloupec je špatnou volbou pro indexování, protože mohutnost je nízká.