sql >> Base de Datos >  >> RDS >> Mysql

60 millones de entradas, entradas seleccionadas de un mes determinado. ¿Cómo optimizar la base de datos?

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.