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:
10.59ms
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: 7.23ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 1.03ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.42ms
✅
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.89ms
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: 7.23ms
Query 3:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 1.03ms
Query 4:
select * from `lessons` where `lessons`.`module_id` = ? and `lessons`.`module_id` is not null order by `order` asc
Time: 0.42ms
Query 5:
select * from `modules` limit 5
Time: 0.27ms
Query 6:
select * from `lessons` where `lessons`.`module_id` in (1, 2, 3) order by `order` asc
Time: 1.04ms
📊 Performance Improvement
-2
Fewer Queries
7.7ms
Time Saved
72.7%
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