Com dificuldades de desempenho lento na sua aplicação Laravel? Você não está sozinho.
Uma das causas mais comuns de aplicações lentas são as consultas lentas ao banco de dados — e identificá-las cedo pode economizar horas de depuração, reclamações de usuários e perda de tráfego. Felizmente, o Laravel facilita o registro de consultas lentas com apenas algumas linhas de código.
Neste artigo, vou te guiar através de uma abordagem passo a passo para detectar e registrar consultas lentas no Laravel — mesmo que você esteja apenas praticando com dados fictícios.
🧠 Por Que Você Deveria Rastrear Consultas Lentas?
Antes de mergulhar no código, vamos entender por que isso importa:
- 🐢 Consultas lentas desaceleram toda sua aplicação
- 🧩 Podem indicar índices faltantes, estrutura de consulta ruim ou joins desnecessários
- 💰 Em uma aplicação em produção, podem custar usuários — e receita
Poder rastrear e registrar essas consultas é uma forma poderosa de tomar controle do desempenho.
🛠️ Passo 1: Habilitar o Registro de Consultas no Laravel
Em AppServiceProvider.php, adicione o seguinte ao método boot():
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
public function boot()
{
DB::enableQueryLog();
DB::whenQueryingForLongerThan(1000, function ($connection) {
Log::warning('⚠️ Long running queries detected:', $connection->getQueryLog());
});
}
🕐 Isso registra qualquer consulta que leve mais de 1000ms (1 segundo).
Você pode ajustar o limite conforme necessário — até 50ms para ambientes de desenvolvimento.
🧪 Passo 2: Criar Dados Fictícios para Testes
Use um seeder para simular um conjunto de dados real:
php artisan make:seeder PostSeeder
Em PostSeeder.php:
use App\Models\Post;
public function run()
{
Post::factory()->count(10000)->create();
}
Execute o seeder:
php artisan db:seed --class=PostSeeder
Agora seu banco de dados tem registros suficientes para testar consultas pesadas.
⚡ Passo 3: Disparar uma Consulta Lenta (Para Testes)
Você pode simular uma consulta lenta usando uma rota simples:
use Illuminate\Support\Facades\DB;
Route::get('/slow-query', function () {
usleep(2000000); // 2 segundos de atraso (em microsegundos)
return DB::table('posts')->limit(1000)->get();
});
Ou se estiver usando MySQL, tente:
return DB::select('SELECT SLEEP(2), title FROM posts LIMIT 1');
Isso criará um atraso longo o suficiente para acionar o registro.
📂 Passo 4: Verificar os Logs
Abra este arquivo:
storage/logs/laravel.log
E você verá algo como:
[2025-04-04 14:15:22] local.WARNING: ⚠️ Long running queries detected: [...]
Pronto! Você acabou de capturar uma consulta lenta.
🔐 Bônus: Registrar SQL Completo com Bindings
Quer ver as instruções SQL exatas?
DB::listen(function ($query) {
Log::info("SQL: {$query->sql} | Time: {$query->time}ms", $query->bindings);
});
Adicione isso ao seu AppServiceProvider@boot() durante o desenvolvimento.
🧩 Casos de Uso no Mundo Real
- Monitorar endpoints de API que respondem muito lentamente
- Depurar painéis administrativos com grandes conjuntos de dados
- Detectar índices faltantes em tabelas frequentemente usadas
✅ Resumo
O Laravel te dá as ferramentas — você só precisa ligar o interruptor.
Ao registrar consultas de longa duração:
- Você ganha melhor visibilidade sobre o desempenho da sua aplicação
- Previne gargalos de desempenho precocemente
- Constrói aplicações mais eficientes e escaláveis
🔔 Próximo passo: Experimente isso no seu projeto atual e mantenha os logs funcionando enquanto desenvolve. Você ficará surpreso com a rapidez com que detecta padrões.