Performance

Diagnóstico de slow queries no MySQL: o método completo

Como identificar, medir e priorizar consultas lentas no MySQL 8 usando slow query log, performance_schema e pt-query-digest.

Consultas lentas raramente avisam antes de derrubar a aplicação. Elas se acumulam silenciosamente até que um pico de tráfego transforma um problema latente em incidente. Este artigo documenta o método que usamos em diagnósticos de performance: capturar, medir e priorizar — nessa ordem.

1. Ative o slow query log (corretamente)

O primeiro passo é ter dados. Sem histórico de consultas lentas, qualquer otimização é chute. No MySQL 8, a configuração mínima recomendada:

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 0.5;
SET GLOBAL log_queries_not_using_indexes = ON;

O valor de long_query_time importa pouco em produção com tráfego alto — o objetivo é amostrar, não registrar tudo. Meio segundo é um bom ponto de partida; ajuste para baixo se o log ficar raso.

Cuidado com long_query_time = 0 em servidores ocupados: o arquivo cresce rápido e o I/O de disco compete com o próprio banco que você está tentando diagnosticar.

2. Use o performance_schema para a visão agregada

O slow log mostra eventos individuais. Para enxergar o padrão, o performance_schema agrega por digest de consulta:

SELECT
  DIGEST_TEXT                                   AS consulta,
  COUNT_STAR                                    AS execucoes,
  ROUND(SUM_TIMER_WAIT / 1e12, 2)               AS total_seg,
  ROUND(AVG_TIMER_WAIT / 1e9, 1)                AS media_ms,
  ROUND(MAX_TIMER_WAIT / 1e9, 1)                AS pior_ms,
  SUM_NO_INDEX_USED                             AS sem_indice
FROM performance_schema.events_statements_summary_by_digest
WHERE SCHEMA_NAME = 'producao'
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

A coluna SUM_TIMER_WAIT é a mais importante: uma consulta de 30 ms executada 50 mil vezes por dia pesa mais que uma consulta de 4 segundos rodada uma vez por hora. Otimize pelo total, não pelo pico isolado.

3. Priorize com a matriz impacto × esforço

Com os dados agregados, classifique cada candidata em uma matriz simples:

Consulta Total/dia Média Esforço de correção Prioridade
Ranking de produtos 420 s 180 ms Índice composto Alta
Relatório mensal 38 s 4,2 s Reescrever SQL Média
Lookup de sessão 35 s 0,9 ms Cache na app Baixa

O ranking de produtos domina o total e se resolve com um índice — é a correção óbvia. O relatório mensal é lento, mas roda fora do horário de pico e não afeta o usuário.

4. Valide antes e depois

Nunca confie em “parece mais rápido”. Meça com EXPLAIN ANALYZE (MySQL 8.0.18+), que executa a consulta e mostra o plano real com tempos por operação:

EXPLAIN ANALYZE
SELECT cliente_id, SUM(valor)
FROM pedidos
WHERE status = 'pago' AND criado_em >= '2026-01-01'
GROUP BY cliente_id;

Compare o tempo total antes e depois da mudança e confirme no performance_schema nas 24 horas seguintes que o SUM_TIMER_WAIT caiu de fato.

Conclusão

Diagnóstico de slow queries é um processo de evidência: log para capturar, performance_schema para agregar, matriz para priorizar e EXPLAIN ANALYZE para validar. Ferramenta nenhuma substitui esse ciclo. Se o seu banco precisa de um diagnóstico estruturado, veja como trabalhamos em nossos serviços de consultoria MySQL.