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.