← Voltar ao blog
MySQL 5 min de leitura

MySQL e MariaDB lentos? 12 causas comuns (e como resolver)

Doze causas que deixam MySQL e MariaDB lentos, do índice que falta ao disco que não aguenta, com o comando para confirmar cada uma.

MySQL e MariaDB lentos? 12 causas comuns (e como resolver)

"O banco está lento." Em 25 anos ouvi essa frase mais vezes do que "bom dia". E quase nunca o culpado é o MySQL ou o MariaDB em si: é o que fizemos com eles. A boa notícia é que as causas se repetem. Aqui estão as doze que eu mais encontro.

Resumo rápido: Doze causas que deixam MySQL e MariaDB lentos, do índice que falta ao disco que não aguenta, com o comando para confirmar cada uma.

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.

Antes de tudo: lento onde?

usuário reclama
     │
     ├─ uma tela só?          → provavelmente uma query (causas 1 a 5)
     ├─ tudo, o tempo todo?   → configuração ou hardware (causas 6 a 9)
     └─ tudo, em picos?       → concorrência, locks, jobs (causas 10 a 12)

1. Falta de índice

A campeã absoluta. Sem índice, o MySQL/MariaDB lê a tabela inteira (full table scan).

EXPLAIN SELECT * FROM pedidos WHERE cliente_id = 42;
-- type: ALL  rows: 3.000.000   ← alerta vermelho
CREATE INDEX idx_pedidos_cliente ON pedidos (cliente_id);

2. Índice que existe, mas não é usado

Função na coluna, tipo diferente ou curinga no começo matam o índice:

WHERE YEAR(criado_em) = 2026          -- não usa índice
WHERE criado_em >= '2026-01-01' AND criado_em < '2027-01-01'  -- usa
WHERE cpf = 12345678900               -- cpf é VARCHAR: conversão implícita
WHERE nome LIKE '%silva'              -- curinga no início

3. SELECT * e colunas demais

Trazer 40 colunas (com TEXT e BLOB) para usar 3 desperdiça disco, memória e rede, e impede índices de cobertura.

4. N+1 queries

A aplicação faz 1 consulta para a lista e 1 para cada item. Mil itens, mil e uma viagens ao banco. Resolva com JOIN ou WHERE id IN (...).

5. Paginação com OFFSET gigante

SELECT * FROM logs ORDER BY id LIMIT 20 OFFSET 500000;  -- lê 500.020 linhas
SELECT * FROM logs WHERE id > 500000 ORDER BY id LIMIT 20; -- keyset: lê 20

6. Buffer pool pequeno

Se os dados mais usados não cabem na memória, tudo vira leitura de disco.

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';          -- leituras do disco
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';  -- leituras totais

Detalhes em como otimizar o InnoDB buffer pool.

7. Redo log pequeno

Com redo log pequeno, o InnoDB faz checkpoints agressivos e a escrita engasga. No MySQL 8.0.30+ ajuste innodb_redo_log_capacity; no MariaDB, innodb_log_file_size.

8. Disco lento ou saturado

iostat -x 1   # %util perto de 100 e await alto = disco é o gargalo

9. Swap

Banco em swap é banco parado. Memória demais para buffers por conexão (sort_buffer_size, join_buffer_size altos multiplicados por centenas de conexões) é causa clássica.

10. Locks e transações longas

Uma transação aberta esquecida segura locks e impede o purge. Veja locks e deadlocks no MySQL e MariaDB.

SELECT trx_id, trx_started, trx_mysql_thread_id, trx_query
  FROM information_schema.innodb_trx ORDER BY trx_started LIMIT 5;

11. Conexões demais

Milhares de conexões simultâneas disputando CPU. Use pool na aplicação; no MariaDB, o thread pool gratuito ajuda muito.

12. Estatísticas desatualizadas

O otimizador escolhe o plano com base em estatísticas. Depois de cargas grandes, rode ANALYZE TABLE pedidos;.

Por onde começar

Ative o slow query log e ataque as consultas que mais somam tempo. O passo a passo está em como encontrar queries lentas no MySQL e MariaDB. Para uma visão completa do servidor, faça um health check.

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 (desenvolvedor frustrado diante de um laptop com ícone de carregamento).