Pergunta

Gostaria de acelerar uma consulta MySQL que, basicamente, recuperar uma página de dados seguindo o padrão abaixo

select
 my_field_A,
 my_field_B
where
 time_id >= UNIX_TIMESTAMP('1901-01-01  00:00:00') AND
 time_id < UNIX_TIMESTAMP('2009-01-16  00:00:00')

O time_id campo é um índice MySQL, ainda, se comporta de consulta como se todo o banco de dados foi lido em cada consulta (recuperar um par de linhas sendo já bastante lento). Eu não um especialista em MySQL. Alguém pode adivinhar o que estou fazendo de errado?

Foi útil?

Solução

Certifique-se de que você tem um índice (B-árvore) em TIME_ID, este deve ser eficiente para consultas por abrangência. Também certifique-se de que TIME_ID está no formato de tempo apropriado.

Se você realmente quer entender o que mysql está fazendo você pode adicionar a palavra-chave 'explicar' na frente da consulta e executá-lo em seu cliente mysql. Isto irá mostrar algumas informações sobre o que o MySQL está fazendo e que tipo de exames são realizados.

http://dev.mysql.com/doc /refman/5.0/en/using-explain.html

Outras dicas

Como existem provavelmente muitos time_id de queda, segundo estes critérios, MySQL pode pensar que a varredura completa da tabela é melhor.

Tente forçar o índice:

SELECT
 my_field_A,
 my_field_B
FROM mytable FORCE INDEX (index_name_on_time_id)
WHERE
 time_id >= UNIX_TIMESTAMP('1901-01-01  00:00:00') AND
 time_id < UNIX_TIMESTAMP('2009-01-16  00:00:00')

Você precisa o intervalo inferior? Existe alguma entrada mais cedo do que 1901? Como é gerada a coluna TIME_ID? Se o TIME_ID é sempre maior a cada nova entrada que está sendo adicionado em DB, você pode querer considerar a busca de ID com a entrada mais próxima de 2009-01-16 e selecione pelo ID

select my_field_A, my_field_B
FROM
  mytable
WHERE
  id <= ?

Se isso não for o caso, tente verificar o particionamento in disponível a partir do MySQL 5.1 e quebrar a tabela por anos, que devem aumentar a velocidade dramaticamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top