Para obtener entradas en un mes en particular, para un año en particular, más rápido, necesita indexar el time
columna
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Además, utilice:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...porque BETWEEN es inclusivo, por lo que obtendría algo fechado "2010-05-01 00:00:00" con la consulta que publicó.
También me gustaría seleccionar datos de cierto mes de un DataSourceID determinado
Puede agregar un índice separado para la columna datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...o configure un índice de cobertura para incluir ambas columnas:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Un índice de cobertura requiere que las columnas más a la izquierda se usen en la consulta para que se use el índice. En este ejemplo, tener time
first funcionará para las dos situaciones que mencionó:datasourceid no tiene que usarse para que el índice sea útil. Pero debe probar sus consultas viendo el resultado de EXPLAIN para saber realmente qué funciona mejor para sus datos y las consultas que se realizan en esos datos.
Dicho esto, los índices ralentizarán las declaraciones INSERT, UPDATE y DELETE. Y un índice no proporciona mucho valor si los datos de la columna tienen pocos valores distintos - IE:una columna booleana es una mala elección para indexar, porque la cardinalidad es baja.