Heeft u last van trage prestaties in uw Laravel-applicatie? U bent niet de enige.
Een van de meest voorkomende oorzaken van trage apps zijn langzame databasequery's — en ze vroeg opsporen kan u uren van debuggen, klachten van gebruikers en verloren verkeer besparen. Gelukkig maakt Laravel het eenvoudig om trage query's te loggen met slechts een paar regels code.
In dit artikel neem ik u mee door een stapsgewijze aanpak om trage query's in Laravel te detecteren en te loggen — zelfs als u alleen maar oefent met testdata.
🧠 Waarom trage query's bijhouden?
Voordat we in de code duiken, laten we begrijpen waarom dit belangrijk is:
- 🐢 Trage query's vertragen uw hele applicatie
- 🧩 Ze kunnen duiden op ontbrekende indexen, slechte querystructuur of onnodige joins
- 💰 In een live app kunnen ze u gebruikers — en omzet — kosten
Query's bijhouden en loggen is een krachtige manier om controle te krijgen over prestaties.
🛠️ Stap 1: Query-logging inschakelen in Laravel
Voeg het volgende toe aan de boot()-methode in AppServiceProvider.php:
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());
});
}
🕐 Dit logt elke query die langer duurt dan 1000ms (1 seconde).
U kunt de drempelwaarde naar wens aanpassen — zelfs tot 50ms voor ontwikkelomgevingen.
🧪 Stap 2: Testdata aanmaken
Gebruik een seeder om een realistische dataset te simuleren:
php artisan make:seeder PostSeeder
In PostSeeder.php:
use App\Models\Post;
public function run()
{
Post::factory()->count(10000)->create();
}
Voer de seeder uit:
php artisan db:seed --class=PostSeeder
Nu bevat uw database genoeg records om zware query's te testen.
⚡ Stap 3: Een trage query simuleren (voor testdoeleinden)
U kunt een trage query simuleren via een eenvoudige route:
use Illuminate\Support\Facades\DB;
Route::get('/slow-query', function () {
usleep(2000000); // 2 seconden vertraging (in microseconden)
return DB::table('posts')->limit(1000)->get();
});
Of als u MySQL gebruikt:
return DB::select('SELECT SLEEP(2), title FROM posts LIMIT 1');
Dit zorgt voor een vertraging die lang genoeg is om de logging te activeren.
📂 Stap 4: De logs controleren
Open dit bestand:
storage/logs/laravel.log
En u ziet iets als:
[2025-04-04 14:15:22] local.WARNING: ⚠️ Long running queries detected: [...]
Bingo! U heeft zojuist een trage query gevonden.
🔐 Bonus: Volledige SQL met bindings loggen
Wilt u exacte SQL-statements zien?
DB::listen(function ($query) {
Log::info("SQL: {$query->sql} | Time: {$query->time}ms", $query->bindings);
});
Voeg dit toe aan uw AppServiceProvider@boot() tijdens ontwikkeling.
🧩 Praktische toepassingen
- API-endpoints monitoren die te traag reageren
- Admin-dashboards debuggen met grote datasets
- Ontbrekende indexen op veelgebruikte tabellen opsporen
✅ Conclusie
Laravel geeft u de tools — u hoeft alleen maar de schakelaar om te zetten.
Door langlopende query's te loggen:
- Krijgt u beter inzicht in de prestaties van uw app
- Voorkomt u prestatieproblemen in een vroeg stadium
- Bouwt u efficiëntere, schaalbaardere applicaties
🔔 Volgende stap: Probeer dit in uw huidige project en laat de logs draaien tijdens de ontwikkeling. U zult verbaasd zijn hoe snel u patronen ontdekt.