← Voltar ao blog
MySQL 5 min de leitura

Como encontrar queries lentas no MySQL e MariaDB

Do slow query log ao EXPLAIN: o caminho para descobrir quais consultas pesam mais no MySQL e no MariaDB, e por quê.

Como encontrar queries lentas no MySQL e MariaDB

Otimizar a query errada é o esporte favorito de quem está com pressa. A consulta de 30 segundos que roda uma vez por dia assusta, mas quem derruba o servidor costuma ser a de 50 milissegundos que roda 2 mil vezes por segundo. No MySQL e no MariaDB, as ferramentas para descobrir isso já vêm na caixa.

Resumo rápido: Do slow query log ao EXPLAIN: o caminho para descobrir quais consultas pesam mais no MySQL e no MariaDB, e por quê.

Série MySQL e MariaDB na prática: comandos válidos para MySQL 8.x e MariaDB 10.6+/11.x, com as diferenças indicadas quando existem.

O fluxo

slow query log ──▶ pt-query-digest ──▶ top 10 por tempo TOTAL
                                            │
performance_schema / sys ──────────────────┘
                                            ▼
                                   EXPLAIN / EXPLAIN ANALYZE
                                            ▼
                                 índice, reescrita ou cache

1. Ligue o slow query log

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 0.5;                  -- segundos
SET GLOBAL log_queries_not_using_indexes = ON;     -- cuidado: pode gerar muito log
SHOW VARIABLES LIKE 'slow_query_log_file';

No MariaDB, log_slow_verbosity = query_plan,explain grava o plano junto com a consulta. Muito útil.

2. Agrupe com pt-query-digest

pt-query-digest /var/lib/mysql/servidor-slow.log > relatorio.txt

Ele normaliza as consultas (troca valores por ?) e ordena por tempo total. Olhe as primeiras: elas costumam somar a maior parte da carga.

3. Sem acesso ao log? Use o sys schema

SELECT query, exec_count, total_latency, avg_latency, rows_examined_avg
  FROM sys.statement_analysis
 ORDER BY total_latency DESC LIMIT 10;

-- Consultas com full table scan
SELECT query, exec_count FROM sys.statements_with_full_table_scans LIMIT 10;

-- O que está rodando agora
SELECT id, time, state, LEFT(info,120) FROM information_schema.processlist
 WHERE command <> 'Sleep' ORDER BY time DESC;

4. Entenda o plano

EXPLAIN SELECT p.id, c.nome FROM pedidos p JOIN clientes c ON c.id = p.cliente_id
 WHERE p.status = 'aberto' ORDER BY p.criado_em DESC LIMIT 20;

EXPLAIN ANALYZE SELECT ...;   -- MySQL 8.0.18+: executa e mostra tempos reais
ANALYZE FORMAT=JSON SELECT ...; -- equivalente no MariaDB

O que procurar:

  • type: ALL → leitura da tabela inteira.
  • rows muito maior que o resultado → filtro sem índice.
  • Using filesort e Using temporary em tabelas grandes.
  • key: NULL → nenhum índice usado.

5. Corrija e meça de novo

Crie o índice certo (veja quando criar e quando remover índices), reescreva a consulta ou elimine chamadas repetidas na aplicação. Depois, compare o tempo total no mesmo período. Sem medir antes e depois, é palpite.

A série completa: MySQL e MariaDB na prática

Precisa de ajuda especializada?

Se o seu ambiente MySQL ou MariaDB precisa de diagnóstico, otimização, backup confiável ou acompanhamento contínuo, conheça a HTI Tecnologia, especialista em bancos de dados.

Ainda decidindo entre os dois? Leia MySQL ou MariaDB: qual é o melhor? e o guia definitivo de MySQL.

Quer dominar a base que os dois compartilham?

MariaDB nasceu do MySQL, e tudo o que é fundamento (modelagem, índices, transações, replicação, otimização) vale para os dois. É isso que eu ensino no livro Aprendendo MySQL: Prática, Teoria, Laboratórios, Desafios e Projetos: 292 páginas, 10 laboratórios guiados, 277 exercícios e 4 desafios com gabarito, e uma máquina virtual pronta para você quebrar (e consertar) à vontade.

Conheça o livro e leia a degustação gratuita.

Bora trocar ideia?

Se este artigo te ajudou (ou te fez discordar, que também vale), me siga no LinkedIn e no Instagram. Lá eu posto bastidores de banco de dados, história da computação e histórias de produção que ninguém conta em curso oficial.


Sobre o autor: Alexandre Almeida atua com bancos de dados há mais de 25 anos, foi instrutor oficial de MySQL e Oracle para mais de 1.000 alunos e escreveu Aprendendo MySQL: Prática, Teoria e Laboratórios.

Fontes: MySQL 8.4 Reference Manual (Oracle), MariaDB Server Documentation (MariaDB Knowledge Base), documentação do Percona Toolkit e do Percona XtraBackup. Imagem de capa: ilustração gerada por IA (pessoa examinando registros impressos com uma lupa ao lado de um monitor com gráficos).