¿Luchas con el rendimiento lento de tu aplicación Laravel? No estás solo.
Una de las causas más comunes de aplicaciones lentas son las consultas lentas a la base de datos — e identificarlas temprano puede ahorrarte horas de depuración, quejas de usuarios y pérdida de tráfico. Afortunadamente, Laravel facilita el registro de consultas lentas con solo unas pocas líneas de código.
En este artículo, te guiaré a través de un enfoque paso a paso para detectar y registrar consultas lentas en Laravel — incluso si solo estás practicando con datos de prueba.
🧠 ¿Por Qué Deberías Rastrear las Consultas Lentas?
Antes de sumergirnos en el código, entendamos por qué esto importa:
- 🐢 Las consultas lentas ralentizan toda tu aplicación
- 🧩 Pueden indicar índices faltantes, mala estructura de consultas o joins innecesarios
- 💰 En una aplicación en producción, pueden costarte usuarios — e ingresos
Poder rastrear y registrar estas consultas es una forma poderosa de tomar control del rendimiento.
🛠️ Paso 1: Habilitar el Registro de Consultas en Laravel
En AppServiceProvider.php, agrega lo siguiente al 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());
});
}
🕐 Esto registra cualquier consulta que tome más de 1000ms (1 segundo).
Puedes ajustar el umbral según necesites — incluso hasta 50ms para entornos de desarrollo.
🧪 Paso 2: Crear Datos de Prueba para Testing
Usa un seeder para simular un conjunto de datos del mundo real:
php artisan make:seeder PostSeeder
En PostSeeder.php:
use App\Models\Post;
public function run()
{
Post::factory()->count(10000)->create();
}
Ejecuta el seeder:
php artisan db:seed --class=PostSeeder
Ahora tu base de datos tiene suficientes registros para probar consultas pesadas.
⚡ Paso 3: Provocar una Consulta Lenta (Para Testing)
Puedes simular una consulta lenta usando una ruta simple:
use Illuminate\Support\Facades\DB;
Route::get('/slow-query', function () {
usleep(2000000); // 2 segundos de retardo (en microsegundos)
return DB::table('posts')->limit(1000)->get();
});
O si estás usando MySQL, prueba:
return DB::select('SELECT SLEEP(2), title FROM posts LIMIT 1');
Esto creará un retardo suficiente para activar el registro.
📂 Paso 4: Revisar los Logs
Abre este archivo:
storage/logs/laravel.log
Y verás algo como:
[2025-04-04 14:15:22] local.WARNING: ⚠️ Long running queries detected: [...]
¡Listo! Acabas de capturar una consulta lenta.
🔐 Bonus: Registrar SQL Completo con Bindings
¿Quieres ver las sentencias SQL exactas?
DB::listen(function ($query) {
Log::info("SQL: {$query->sql} | Time: {$query->time}ms", $query->bindings);
});
Agrega esto a tu AppServiceProvider@boot() durante el desarrollo.
🧩 Casos de Uso en el Mundo Real
- Monitorear endpoints de API que responden demasiado lento
- Depurar paneles de administración con grandes conjuntos de datos
- Detectar índices faltantes en tablas de uso frecuente
✅ Resumen
Laravel te da las herramientas — solo necesitas activar el interruptor.
Al registrar consultas de larga duración:
- Obtienes mejor visibilidad sobre el rendimiento de tu aplicación
- Previenes cuellos de botella de rendimiento tempranamente
- Construyes aplicaciones más eficientes y escalables
🔔 Siguiente paso: Prueba esto en tu proyecto actual y mantén los logs funcionando mientras desarrollas. Te sorprenderá lo rápido que detectas patrones.