Estimando o tempo de execução de consulta do MySQL

4

Eu executei uma consulta MySQL a partir da linha de comando usando o seguinte:

nohup mysql --user=root --password=XXXXXXXXX database < report.sql > results.tab

Essa consulta é extensa (5000 linhas) e executa uma pesquisa complexa com mais de 90.000.000 linhas de 150 tabelas.

Esta consulta está em execução há mais de 24 horas e ainda não terminou.

Existe uma maneira de executar a verificação de status nesta consulta em execução?

    
por reefine 05.01.2012 / 09:04

2 respostas

4

Bem, você pode logar em um console mysql e distribuir o comando SHOW PROCESSLIST; . Isso mostrará quais consultas estão sendo executadas, mas você não receberá uma estimativa, quando essas consultas terminarão.

Se você executar as consultas com um prefixo EXPLAIN EXTENDED de antemão, isso mostrará a cardinalidade e outros detalhes relevantes sobre a consulta. Isso pode ajudá-lo, mas como a consulta está em execução, você pode usar outra abordagem, explicada em detalhes em mysqlperformanceblog .

Trecho:

A resposta foi simples, porque não havia mais nada em execução no servidor. Isso significa que SHOW GLOBAL STATUS deu uma ideia aproximada do que a consulta estava realmente fazendo. (Se houvesse muita atividade no servidor, eu não teria sido capaz de dizer com segurança que SHOW GLOBAL STATUS mostrava o que aquela consulta estava fazendo; a atividade de outras consultas também teria sido misturada ali. ser ótimo para poder escolher outro tópico e ver apenas o seu status, mas o MySQL não permite que você faça isso.)

A solução foi medir a rapidez com que a consulta estava varrendo linhas na varredura de tabela da tabela de fatos. Isso é mostrado pela variável de status Handler_read_rnd_next. Aqui está uma maneira fácil de assistir (innotop é outra maneira prática):

mysqladmin extended -r -i 10 | grep Handler_read_rnd_next
-- ignore the first line of output...
| Handler_read_rnd_next             | 429224      |

O servidor estava lendo aproximadamente 43 mil linhas por segundo e havia 150 milhões de linhas na tabela. Um pouco de matemática depois, e você terá 3488 segundos para completar, ou um pouco menos de uma hora. E, de fato, a consulta foi concluída em cerca de 55 minutos.

Este é o caso mais simples, e há outros mais complicados a considerar, mas esperamos que isso lhe dê uma ideia de como você pode resolver esse problema em diferentes situações.

    
por 05.01.2012 / 10:10
0

Parece que não é uma tarefa fácil estimar o progresso de uma consulta em execução. Você pode dar uma olhada em este post .

Outras opções que posso enfatizar:

  1. Você pode usar uma ferramenta do sistema como top para garantir que ela ainda esteja em execução (consumindo CPU).
  2. Recomenda-se dividir sua consulta complexa para várias consultas, se possível. Nesse caso, você pode simplesmente escrever um script para executar várias consultas e ecoar algumas informações entre cada duas execuções consecutivas. Desta forma, você pode saber o progresso do trabalho.
por 05.01.2012 / 10:04