Laravel N+1: Problema e Solução

Posted on: February 18, 2026 04:53 PM

Posted by: Renato

Categories: Laravel

Views: 156

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)
  • $usuario->perfil->biografia
  • @endforeach

    Se você tiver 1.000 usuários:

    1. "1" consulta é feita para listar todos os usuários.

    2. "N" (1.000) consultas extras são feitas dentro do loop, uma para cada perfil.

    3. 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

    1. Eager Loading Automático: Se um modelo sempre precisa de um relacionamento, você pode usar a propriedade $with no Model:

      protected $with = ['perfil'];
    2. 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 with(). Adicione isto ao seu AppServiceProvider:

      Model::preventLazyLoading(! app()->isProduction());
    3. 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/



    5

    Share

    Donate to Site


    About Author

    Renato

    Developer

    Add a Comment
    Comments 0 Comments

    No comments yet! Be the first to comment

    Blog Search


    Categories

    Laravel (227) PHP (151) linux (124) Variados (110) ubuntu (58) Dicas (58) developer (48) postgresql (45) database (44) sql (42) Docker (32) mysql (31) front-end (31) devops (26) webdev (24) programming (23) tecnologia (19) eloquent (19) aws (19) dba (18) backend (16) OUTROS (17) laravelphp (16) debian (12) dev (12) git (10) react (10) reactjs (10) 100DaysOfCode (10) node (9) PHP Swoole (9) javascript (9) nginx (9) inteligencia-artificial (9) linux-tools (8) Architecture (8) ciencia (7) github (7) vue (7) vim (6) jwt (6) arquitetura (6) windows (6) nodejs (6) api (6) vscode (6) webservice (6) DevSecOps (5) apache (5) macox (5) s3 (5) servers (5) ia (5) authentication (5) reactnative (5) rest (5) Swoole (4) lets-encrypt (4) query (4) Raspberry (4) angularjs (4) inteligenciadedados (4) Padrao de design (4) artigo (4) wsl (4) google (4) npm (4) openai (4) opensource (4) mariadb (4) jenkins (4) Kubernetes (4) gitlab (4) angular (4) autenticacao (4) shell (4) mongodb (4) ssh (3) bash (3) hardware (3) tests (3) macos (3) web (2) jobs (3) websocket (3) politica (3) db (3) mysqli (3) Black Hat (3) RabbitMQ (3) educacao (3) intel (3) CMS (2) sail (3) script (3) performance (3) js (3) blade (3) terminal (3) log (3) mac (3) fedora (3) containers (3) json (3) authorization (3) phpswoole (3) ddd (3) policia (2) neovim (2) golang (2) noticias (2) livros (2) Transcribe (2) ElonMusk (2) redis (2) claude (2) ArchLinux (2) java (2) saude (1) seguranca (2) auth (2) cron (2) phpunit (2) kube (2) multiple_authen (2) laptop (2) gnome (2) powerbi (2) telefonia (2) nvm (2) imagick (2) maps (2) colors (2) Passport (2) JQuery (2) phpfpm (2) autorizacao (2) monitoring (2) Go (2) BigLinux (2) POO (2) LazyVim (2) gource (2) Python (2) Oauth2 (2) android (2) unix (2) magento (2) iot (2) ffmpeg (2) combustivel (2) webhook (2) microservices (2) Curisidades (2) Solid (2) zsh (2) bancodedados (2) tailwind (2) homeOffice (2) html (2) openswoole (2) artificialintelligence (2) security (2) Glacier (1) laraveloctane (1) Deus (1) binaural (1) gpt (1) bolsonaro (1) privacidade (1) linkedin (1) documentation (1) brain (1) adb (1) nvidia (1) host (1) ecommerce (1) c4-models (1) altadisponibilidade (1) octane (1) lucena (1) http (1) TypeScript (1) chatgpt (1) idiomas (1) eventdrive (1) uuid (1) restfull (1) aplicativo (1) optimization (1) mapas (1) Fetch (1) collections (1) RustLang (1) matematica (1) Filament (1) compactar (1) paypal (1) microg (1) forcas armadas (1) militar (1) fullsta (1) smartphones (1) automacao (1) Monitor (1) zend (1) spaceship (1) PKCE (1) l2tp (1) Deepin (1) storage (1) benchmark (1) networking (1) Swoole (1) biologia (1) node-red (1) LETSENCRYPT (1) Grunt (1) Diagramas (1) boot (1) haru (1) dracula (1) TrabalhoEmEquipe (1) Brasil (1) queue (1) agi (1) llama (1) hotfix (1) economia (1) transcription (1) cache (1) Amazon (1) October (1) lumen (1) Hyperf (1) replication (1) faceapp (1) vala (1) cloudstack (1) rpi (1) apple (1) oracle (1) iode (1) ffaa (1) vpn (1) MeioAmbiente (1) firefox (1) composer (1) scheduling (1) Asahi (1) pendrive (1) microservice (1) front (1) cor (1) auth (1) modelagemdedados (1) k8s (1) gasolina (1) wsl2 (1) csv (1) soap (1) piada (1) KubeCon (1) zorin-os (1) spring-boot (1) backup (1) playwright (1) Desenvolvedor (1) Structurizr (1) symfony (1) presenter (1) lider (1) guard (1) tensorflow (1) bootstrap (1) nuance (1) historia (1) dropbox (1) traefik (1) bug (1) akitando (1) llm (1) htm (1) transformers (1) cavalotroia (1) odd (1) m1 (1) Error (1) cinnamon (1) repmgr (1) federal (1) ruby (1) AppSec (1) orm (1) ArquiteturaDeSoftware (1) Passwordless (1) memcached (1) flow (1) compression (1) athena (1) front (1) wine (1) covid19 (0) services (1) phpjasper (1) models (1) kali-linux (1) geojson (1) yarn (1) picpay (1) Monolith (1) banco (1) PNPM (1) podcast (1) n8n (1) LaravelFilament (1) God (1) DesenvolvimentoProfissional (1) sw (1) bigtech (1) postgres (1) NoCookies (1) LeetCode (1) governancadedados (1) prf (1) nosql (1) Lideranca (1) Hackers (1) Bots (1) pytorch (1) nuxt (1) liquid (1) ec2 (1) transaction (1) c4 (1) rancher (1) algoritimo (1) Observability (1) Elasticsearch (1) translate (1) certbot (1) Oh My Zsh (1) ibm (1) escopos (1) usb (1) ckeditor (1) API_KEY_GOOGLE_MAPS (1) Manjaro (1) vicuna (1) coding (1) rust (1) markdown (1) JasperReports (1) Fibonacci (1) community (1) Samurai (1) payment (1) messaging (1) Jesus (1) flutter (1) Migration (1) workflow (1) cqrs (1) kitematic (1) geospacial (1) yeshua (1) data (1) sonarqube (1) Axios (1) pipelines (1) Mozilla (1) kvm (1) GitOps (1) sqlite (1) OOD (0) controllers (0)

    New Articles



    Get Latest Updates by Email