За да получите записи през конкретен месец, за определена година, по-бързо - ще трябва да индексирате time
колона
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Освен това използвайте:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...защото BETWEEN е включващо, така че ще получите всичко с дата "2010-05-01 00:00:00" със заявката, която сте публикували.
Също така бих искал да избера данни от определен месец от даден DataSourceID
Можете да добавите отделен индекс за колоната datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...или настройте покриващ индекс, който да включва и двете колони:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Покриващ индекс изисква най-лявата колона да се използва в заявката, за да се използва индексът. В този пример има time
first ще работи и за двете ситуации, които споменахте - datasourceid не трябва да се използва, за да може индексът да бъде полезен. Но трябва да тествате заявките си, като прегледате изхода EXPLAIN, за да разберете наистина какво работи най-добре за вашите данни и заявките, които се изпълняват върху тези данни.
Въпреки това индексите ще забавят операторите INSERT, UPDATE и DELETE. И индексът не предоставя много стойност, ако данните в колоната имат малко различни стойности - IE:булева колона е лош избор за индексиране, тъй като мощността е ниска.