The N+1 Query Problem
One of the most common performance killers in Laravel applications. Watch how query count explodes!
❌
Without Eager Loading
Module::take(5)->get() then $module->lessons in loop
$modules = Module::take(5)->get();
foreach ($modules as $module) {
echo $module->lessons->count();
// ⚠️ Triggers a new query!
}
Total Queries:
4
Execution Time:
2.2ms
Queries Executed:
Query 1:
select * from `modules` limit 5
Time: 0.39ms
Query 2:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.44ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.29ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.34ms
✅
With Eager Loading
Module::with('lessons')->take(5)->get()
$modules = Module::with('lessons')
->take(5)->get();
foreach ($modules as $module) {
echo $module->lessons->count();
// ✅ No query! Already loaded
}
Total Queries:
6
Execution Time:
1.17ms
Queries Executed:
Query 1:
select * from `modules` limit 5
Time: 0.39ms
Query 2:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.44ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.29ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.34ms
Query 5:
select * from `modules` limit 5
Time: 0.19ms
Query 6:
select * from `lessons` where `lessons`.`module_id` in (1, 2, 3) order by `order` asc
Time: 0.63ms
📊 Performance Improvement
-2
Fewer Queries
1.03ms
Time Saved
46.9%
Faster
💡 Key Takeaways
- • N+1 Problem: Accessing relationships in a loop triggers individual queries for each item
-
•
Solution: Use
with()to eager load relationships upfront - • Impact: Can reduce queries from hundreds to just 2-3, massively improving performance
-
•
Detection: Use Laravel Debugbar or enable
Model::preventLazyLoading()in development