MySQL lento: como achar as consultas que travam o site
Aprenda a achar as consultas que deixam o MySQL lento: ligue o log, resuma com mysqldumpslow, analise com EXPLAIN e desligue o log depois.
Por Redação Eleven Host · @robson.direitodigital · 27 de outubro de 2026 · 7 min de leitura

Capa da Redação Eleven Host para o guia: MySQL lento: como achar as consultas que travam o site Arte: Eleven Host
Para investigar um MySQL lento, o caminho é ligar o log de consultas lentas, resumir o arquivo com o mysqldumpslow e analisar a consulta mais pesada com o EXPLAIN. Assim você tem dados para identificar quais instruções demoram, em vez de adivinhar.
Este guia segue essa ordem: sinais de que o banco é o gargalo, como ligar o log na hora e de forma fixa, como ler o resultado, como investigar uma consulta e como desligar o log depois. Os nomes meu_banco, pedidos e cliente_id são exemplos. Troque pelos seus.
Sinais de que o banco é o gargalo
Quando o site ou o sistema fica lento e o culpado é o banco, muitas vezes há algumas consultas demorando. Alguns sinais ajudam a suspeitar disso:
- Uma página específica demora, enquanto as outras abrem normalmente.
- A lentidão aparece em relatórios, buscas ou listagens grandes.
- O problema piora quando a tabela cresce.
- A página demora para carregar, mas o servidor web não mostra erro.
Esses sinais são pistas, não prova. Para confirmar, use o registro próprio do MySQL para isso: o log de consultas lentas (slow query log). Segundo a documentação do MySQL 8.4, ele guarda as instruções SQL que levam mais de long_query_time segundos e examinam pelo menos min_examined_row_limit linhas. Ele vem desligado por padrão.
Ligar o log de consultas lentas na hora
Dá para ligar o log sem reiniciar o MySQL. Entre no cliente mysql como administrador e rode:
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
O valor 1 em long_query_time é só um exemplo: registrar consultas acima de 1 segundo. O padrão do MySQL é 10 segundos, o mínimo é 0 e o campo aceita frações. A mudança vale para as conexões abertas depois dela. Para ver se o log está ligado e em qual arquivo ele grava, rode:
SHOW VARIABLES LIKE 'slow_query%';
Se você não definir o nome do arquivo, a documentação diz que o padrão é o nome da máquina seguido de -slow.log, dentro do diretório de dados. Para escolher o arquivo, rode:
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
O destino também depende da variável log_output. O MySQL só grava no arquivo se ela incluir FILE, que é o padrão. Se estiver como NONE, nada é gravado.
O log pode conter dados das consultas. Segundo a documentação, senhas nas instruções gravadas são reescritas para não aparecerem em texto puro, mas mesmo assim proteja o arquivo e não o publique.
Deixar o log fixo no mysqld.cnf
Os comandos SET GLOBAL valem até o MySQL reiniciar. Para o log sobreviver a um reinício, edite o arquivo de configuração no Ubuntu:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Na seção [mysqld], acrescente estas linhas:
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
Salve e reinicie o serviço:
sudo systemctl restart mysql
Se o MySQL não subir depois da mudança, volte ao arquivo e confira se as linhas foram digitadas como acima, dentro da seção certa.
A documentação também tem a opção log_queries_not_using_indexes, que registra consultas que não usam índice. Ela pode fazer o log crescer rápido, e existe a variável log_throttle_queries_not_using_indexes para limitar o volume. Use a opção por pouco tempo.
Precisa de um banco de dados na nuvem? Conheça o 11SQL, a partir de R$ 9,90/mês no 11SQL Mini; confira na loja o que cada plano inclui. Ver planos do 11SQL
Ler o log com o mysqldumpslow
Com o site em uso por um tempo, o arquivo enche de linhas difíceis de ler. O mysqldumpslow resume o arquivo: ele agrupa consultas parecidas, trocando números por N e textos por 'S'. Rode:
sudo mysqldumpslow /var/log/mysql/mysql-slow.log
Por padrão, a lista sai ordenada pelo tempo médio (-s at). Cada grupo mostra Count (quantas vezes apareceu), Time, Lock e Rows. Para mudar a ordenação, use a opção -s:
-s t: tempo total.-s c: quantidade de vezes.-s l: tempo de lock.-s r: linhas enviadas.
Para ver só as 10 primeiras, acrescente -t 10. Este exemplo mostra as 10 consultas que mais tomaram tempo somado:
sudo mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
Uma consulta rápida que roda milhares de vezes pode pesar mais no total do que uma lenta que roda uma vez. Por isso vale olhar a lista por tempo total e por quantidade.
Investigar com EXPLAIN e criar um índice
Escolha uma consulta do topo do resumo e rode o EXPLAIN antes dela, no cliente mysql:
EXPLAIN SELECT * FROM pedidos WHERE cliente_id = 15;
Segundo a documentação, o EXPLAIN mostra o plano de execução: como o MySQL vai processar a instrução, como junta as tabelas e em que ordem. Com isso você vê onde adicionar índices para a instrução achar as linhas. Ele funciona com SELECT, DELETE, INSERT, REPLACE e UPDATE.
Se o plano indicar que falta um índice, este é um exemplo de criação:
CREATE INDEX idx_pedidos_cliente ON pedidos (cliente_id);
Dois cuidados antes de rodar. Primeiro, faça um backup do banco: o guia Backup MySQL com mysqldump: como fazer e restaurar mostra como. Segundo, rode fora do horário de pico, porque criar índice em tabela grande pode demorar. Depois, rode o EXPLAIN de novo e compare com o plano anterior. Não há como prometer ganho antes de testar: o resultado depende da sua tabela e das suas consultas.
Desligar o log depois da investigação
O log cresce com o uso e pode conter dados das consultas. Quando terminar, desligue o log:
SET GLOBAL slow_query_log = 0;
Se você deixou as linhas no mysqld.cnf, remova-as ou troque o valor para 0, para o log não voltar a ligar no próximo reinício. Guarde ou apague o arquivo de log com cuidado, já que ele pode ter dados das consultas.
Quando o problema não é o banco
Se o log não mostra consultas demoradas, a lentidão pode estar em outro ponto. Veja estas causas:
- A VPS está sem memória livre. O guia VPS lenta ajuda a conferir isso, e o Swap na VPS: como criar e ajustar no Ubuntu explica a memória de apoio.
- Há muitas conexões abertas ao mesmo tempo.
- O aplicativo não usa cache e repete as mesmas consultas.
Trocar de plano pode ou não resolver. Confirme a causa antes de pagar por mais recursos. Se o seu banco está em outro serviço, o guia Banco de dados MySQL na nuvem: guia para começar mostra como é esse caminho.
Checklist da investigação
- Suspeitei do banco por sinais concretos, e não só por palpite.
- Liguei o
slow_query_loge conferi comSHOW VARIABLES. - Defini um
long_query_timee deixei o site rodar por um tempo. - Resumi o arquivo com o
mysqldumpslow, por tempo total e por quantidade. - Rodei o
EXPLAINna consulta mais pesada. - Fiz backup antes de criar um índice e testei fora do pico.
- Comparei o
EXPLAINantes e depois. - Desliguei o log e protegi o arquivo.
- Se o log estava vazio, conferi memória, conexões e cache.
Quer o banco e o app em servidores seus? Os planos de VPS começam em R$ 17,00/mês, no Plano Bronze; confira na loja o que cada plano inclui. Ver planos de VPS
Perguntas frequentes
O log de consultas lentas vem ligado?
Não. Segundo a documentação do MySQL, ele vem desligado por padrão. Você liga com SET GLOBAL slow_query_log = 1;.
Qual valor usar no long_query_time?
O padrão é 10 segundos, e o campo aceita frações. O valor 1 usado neste guia é um exemplo. Escolha um valor que mostre as consultas que incomodam no seu caso.
Preciso reiniciar o MySQL para ligar o log?
Para ligar na hora, não: o SET GLOBAL já liga o log. Para o log continuar ligado depois de um reinício, coloque as linhas no mysqld.cnf e reinicie o serviço.
Criar um índice resolve a lentidão?
Pode ajudar quando o EXPLAIN mostra que falta um. O resultado depende da tabela e da consulta, então teste e compare o plano antes e depois.