Para obter entradas em um determinado mês, para um determinado ano, mais rapidamente - você precisa indexar a
time
coluna
:CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Além disso, use:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...porque BETWEEN é inclusivo, então você obteria qualquer coisa datada de "2010-05-01 00:00:00" com a consulta que você postou.
Eu também gostaria de selecionar dados de um determinado mês de um determinado DataSourceID
Você pode adicionar um índice separado para a coluna datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...ou configure um índice de cobertura para incluir ambas as colunas:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Um índice de cobertura requer que as colunas mais à esquerda sejam usadas na consulta para que o índice seja usado. Neste exemplo, ter
time
first funcionará para ambas as situações que você mencionou - datasourceid não precisa ser usado para que o índice seja útil. Mas você precisa testar suas consultas visualizando a saída EXPLAIN para realmente saber o que funciona melhor para seus dados e as consultas que estão sendo realizadas nesses dados. Dito isso, os índices irão desacelerar as instruções INSERT, UPDATE e DELETE. E um índice não fornece muito valor se os dados da coluna tiverem poucos valores distintos - IE:uma coluna booleana é uma má escolha para indexar, porque a cardinalidade é baixa.