O Laravel é lento? Entenda por que sua aplicação não escala
Muita gente culpa o Laravel pela lentidão da aplicação. Mas a verdade é que na maioria das vezes o problema não está no framework — está na query.
Antes de entrar nessa discussão, deixa eu te fazer uma pergunta simples:
👉 Você entende a diferença entre essas duas queries?
SELECT * FROM orders WHERE DATE(created_at) = '2025-10-24';
SELECT * FROM orders WHERE created_at BETWEEN '2025-10-24' AND '2025-10-24 23:59:59.999999';
O resultado é o mesmo. Mas o impacto no desempenho é gigantesco.
🚀 O que é SARGABLE (Search ARGument ABLE)
Uma query sargable é aquela que permite o uso de índices na busca. Em outras palavras, é uma consulta que o otimizador do banco consegue acelerar usando a estrutura de indexação existente.
Quando você faz algo como:
WHERE DATE(created_at) = '2025-10-24'
Você está envolvendo uma coluna indexada em uma função, e isso quebra o uso do índice. O MySQL (ou qualquer outro SGBD) precisa varrer toda a tabela para calcular o valor da função linha por linha — o famoso full table scan.
Já a segunda query:
WHERE created_at BETWEEN '2025-10-24' AND '2025-10-24 23:59:59.999999'
é sargable — ela permite que o banco use o índice em created_at, reduzindo drasticamente o tempo de busca.
🧠 Testando na prática com o MySQLSLAP
Para comprovar isso, foi usado o utilitário mysqlslap, uma ferramenta nativa do MySQL que simula carga de concorrência.
mysqlslap --concurrency=1,10,40,100 --iterations=3 --query="SELECT ..." --create-schema=meubanco
O teste mostrou que:
- Com 1 usuário, ambas as queries performam bem (diferença imperceptível).
- Com 40 usuários, a query não sargable demorou 4 segundos, enquanto a otimizada levou 800ms.
- Com 100 usuários, a diferença ficou ainda mais brutal: 9 segundos vs 2 segundos.
💡 Ou seja: em ambiente real e com concorrência, o impacto é exponencial.
🧩 Aplicando isso no Eloquent
Esse tipo de erro é muito comum no Laravel. Veja o exemplo a seguir:
// ❌ Errado — quebra o índice
Order::whereDate('created_at', $date)->paginate(50);
// ✅ Certo — aproveita o índice
Order::whereBetween('created_at', [
Carbon::parse($date)->startOfDay(),
Carbon::parse($date)->endOfDay()
])->paginate(50);
No primeiro caso, o whereDate aplica uma função sobre a coluna e perde a indexação. No segundo, a busca é direta e totalmente sargable.
Essa diferença pode parecer pequena, mas em produção e sob carga, é o que separa uma aplicação que escala de uma que trava.
🔥 Testando com o Laravel Octane
Para o teste dentro do Laravel, o ambiente foi configurado com Octane (para simular concorrência real). Utilizando o Pest PHP com testes de estresse, a diferença foi absurda:
| Query | Requisições respondidas | Tempo médio |
|---|---|---|
| Sargable (whereBetween) | 1.732 | 256ms |
| Não Sargable (whereDate) | 80 | 9s |
Essa diferença é o reflexo direto da otimização — o mesmo código, a mesma rota, mas uma abordagem correta.
💬 Conclusão
Antes de dizer que o Laravel é lento, pergunte-se:
- Minhas queries são sargables?
- Estou aproveitando os índices corretamente?
- Meus filtros e funções não estão destruindo a performance?
O problema raramente é o framework — é a forma como você o usa.
Se você quiser ver tudo isso rodando ao vivo, com explicações visuais e testes reais, assista o vídeo completo no canal Beer and Code.
E se quiser aprender a fundo como escrever queries performáticas no Eloquent, sem cair nesses erros bobos, conheça o Clã Beer and Code — onde nossos alunos aprendem a escrever código que escala de verdade.
{AI Engineer} — apaixonado por Laravel, arquitetura de software e construir produtos com impacto. Compartilho aqui tutoriais, descobertas e reflexões sobre o dia a dia de engenharia.
Você também pode gostar
A Importância do Eager Loading no Laravel: Evitando o Problema N+1
O eager loading é uma técnica essencial no Laravel para otimizar o desempenho de aplicações, evitando o problema de consultas N+1. Este artigo explica como o eager loading funciona, os impactos de não utilizá-lo e como configurar o Laravel para prevenir problemas relacionados ao lazy loading, incluindo o uso do recurso de carregamento automático de relacionamentos.
Como Executar Processos em Concorrência no Laravel: Importando Grandes Arquivos CSV
Aprenda a usar a facade Concurrency do Laravel para executar tarefas em paralelo e melhorar a performance, com um exemplo prático de importação de grandes arquivos CSV.
Otimize sua aplicação Laravel com o novo Memoized Cache Driver (Laravel 12.9)
O Laravel 12.9 trouxe uma novidade poderosa: o Memoized Cache Driver. Essa feature otimiza o desempenho das aplicações ao armazenar em memória os valores obtidos do cache durante o tempo de execução da requisição, evitando múltiplos acessos ao cache.
Do prompt ao carrinho: arquitetura de um agente que compara ofertas entre Amazon, Mercado Livre e Magalu
O agente que compara preços entre Amazon, Mercado Livre e Magalu funciona uma vez na frente da câmera. Em produção quebra em três pontos que a demo nunca mostra: produto que não é o mesmo, frete e cupom ignorados, e API que vai morrer em abril. Este post abre a arquitetura em cinco camadas e mostra as decisões que separam demo de feature real.