recuperação de página rápida em MySQL, a utilização do índice?
-
03-07-2019 - |
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?
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.
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.