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:
5.77ms
Queries Executed:
Query 1:
select * from `modules` limit 5
Time: 0.31ms
Query 2:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 2.05ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.72ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.36ms
✅
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:
2.09ms
Queries Executed:
Query 1:
select * from `modules` limit 5
Time: 0.31ms
Query 2:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 2.05ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.72ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.36ms
Query 5:
select * from `modules` limit 5
Time: 0.24ms
Query 6:
select * from `lessons` where `lessons`.`module_id` in (1, 2, 3) order by `order` asc
Time: 1.19ms
📊 Performance Improvement
-2
Fewer Queries
3.68ms
Time Saved
63.8%
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