Base de Conhecimento

MySQL lento: como achar as consultas que travam o site

  • mysql lento, slow query log, mysqldumpslow, explain, mysql, tutorial
  • Usuários acharam útil: 0

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

Arte da Eleven Host: janela de terminal com o título: MySQL lento: como achar as consultas que travam o site

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:

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_log e conferi com SHOW VARIABLES.
  • Defini um long_query_time e deixei o site rodar por um tempo.
  • Resumi o arquivo com o mysqldumpslow, por tempo total e por quantidade.
  • Rodei o EXPLAIN na consulta mais pesada.
  • Fiz backup antes de criar um índice e testei fora do pico.
  • Comparei o EXPLAIN antes 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.

Esta resposta lhe foi útil?

Artigos Relacionados