Posted on: February 18, 2026 04:53 PM
Posted by: Renato
Categories: Laravel
Views: 158
O Assassino Silencioso da Performance no Laravel: Como Identificar e Destruir o Problema N+1
Você já sentiu que, conforme sua aplicação cresce, ela vai ficando inexplicavelmente lenta? Você otimiza o servidor, aumenta a memória, mas o tempo de resposta continua alto. O culpado pode estar escondido em uma funcionalidade que amamos no Laravel: o Eloquent ORM.
A imagem que abre este artigo é um caso real de Problema N+1. Note os números alarmantes: 1059 queries executadas em uma única requisição, levando segundos para processar. O diagnóstico? consultas duplicadas.
O que é o Problema N+1?
O Eloquent utiliza Lazy Loading (carregamento preguiçoso). Isso significa que ele só busca os dados de um relacionamento no banco de dados no momento exato em que você os acessa.
Parece eficiente, mas veja este cenário comum em uma View Blade:
PHP
@foreach($usuarios as $usuario)Se você tiver 1.000 usuários:
-
"1" consulta é feita para listar todos os usuários.
-
"N" (1.000) consultas extras são feitas dentro do loop, uma para cada perfil.
-
Resultado: 1.001 consultas ao banco de dados para algo simples.
O Diagnóstico: Laravel Debugbar
Como visto na imagem, a ferramenta fundamental para detectar isso é o Laravel Debugbar. Ele expõe visualmente o que acontece "por baixo do capô". Se você vir centenas de queries repetidas (como SELECT * FROM perfis WHERE usuario_id = ?), você encontrou o gargalo.
A Solução: Eager Loading (Carregamento Antecipado)
A solução é avisar ao Eloquent, ainda no Controller, quais relacionamentos você vai precisar. Usamos o metodo with().
❌ Jeito Errado (Gera N+1):
$usuarios = Usuario::all();✅ Jeito Certo (Performance Otimizada):
$usuarios = Usuario::with('perfil')->get();Com o with(), o Laravel faz apenas duas queries: uma para os usuários e outra única para todos os perfis relacionados, unindo-os na memória. O ganho de performance é brutal — muitas vezes reduzindo o tempo de resposta de segundos para milissegundos.
Dicas de Ouro para Profissionais
-
Eager Loading Automático: Se um modelo sempre precisa de um relacionamento, você pode usar a propriedade
protected $with = ['perfil'];$withno Model: -
Proibir Lazy Loading em Desenvolvimento: Nas versões recentes do Laravel, você pode impedir que o Lazy Loading aconteça durante o desenvolvimento, fazendo a aplicação dar erro se você esquecer o
Model::preventLazyLoading(! app()->isProduction());with(). Adicione isto ao seuAppServiceProvider: -
Dica de View: Use o metodo whenLoaded() para evitar erros caso o relacionamento não tenha sido chamado, garantindo um código mais limpo e seguro.
Conclusão
Código limpo não é apenas código legível, é código performático. O problema N+1 é uma armadilha fácil de cair, mas também e uma das mais fáceis de resolver se você souber usar as ferramentas certas.
E você? Já passou pelo susto de abrir o Debugbar e ver milhares de queries rodando? Como você resolveu? Comente abaixo!
- https://www.linkedin.com/feed/update/urn:li:activity:7429630727429750784/
Donate to Site
Renato
Developer