Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

60 milhões de entradas, selecione entradas de um determinado mês. Como otimizar o banco de dados?


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.