Aby szybciej uzyskać wpisy w danym miesiącu, w danym roku - będziesz trzeba zindeksować time
kolumna
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Dodatkowo użyj:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...ponieważ BETWEEN jest inkluzywne, więc wraz z opublikowanym zapytaniem otrzymasz wszystko z datą „2010-05-01 00:00:00”.
Chciałbym również wybrać dane z określonego miesiąca z danego DataSourceID
Możesz dodać osobny indeks dla kolumny Datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...lub ustaw indeks pokrywający, aby zawierał obie kolumny:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Indeks pokrywający wymaga, aby w zapytaniu zostały użyte kolumny znajdujące się najbardziej po lewej stronie, aby indeks został użyty. W tym przykładzie, mając time
pierwszy zadziała w obu sytuacjach, o których wspomniałeś — datasourceid nie musi być używany, aby indeks był użyteczny. Ale musisz przetestować swoje zapytania, wyświetlając dane wyjściowe EXPLAIN, aby naprawdę wiedzieć, co najlepiej sprawdza się w przypadku Twoich danych i zapytań wykonywanych na tych danych.
To powiedziawszy, indeksy spowolnią instrukcje INSERT, UPDATE i DELETE. A indeks nie zapewnia dużej wartości, jeśli dane w kolumnie mają kilka odrębnych wartości - IE:kolumna logiczna to zły wybór do indeksowania, ponieważ kardynalność jest niska.