我在 Laravel 应用中将数据库查询优化了 90%
发布: (2025年12月22日 GMT+8 08:48)
2 min read
原文: Dev.to
Source: Dev.to
背景
当我接手一个性能不佳的 Laravel 应用时,用户仪表盘加载订单、客户和产品等相关数据非常慢。我使用 Laravel Debugbar 分析查询,发现了经典的 N+1 问题。
步骤 1:预加载
// Before: N+1 queries
$orders = Order::all();
foreach ($orders as $order) {
echo $order->customer->name; // New query each time!
}
// After: Optimized
$orders = Order::with(['customer', 'items.product'])->get();
步骤 2:查询作用域
public function scopeWithFullDetails($query)
{
return $query->with([
'customer.priceList',
'items.product.category',
'payments',
]);
}
步骤 3:策略性缓存
$products = Cache::remember('products.catalog', 3600, function () {
return Product::with('category')->get();
});
结果
- 页面加载时间:3–5 秒 → 500 毫秒以下
- 数据库查询次数:100+ → 每页不足 10 次
- 服务器负载显著降低
- 用户体验更佳
关键要点
- 优化前一定要先分析——不要盲目猜测瓶颈所在。
- 预加载是好帮手,但也要避免把所有关联都一次性预加载。
- 明智地使用缓存——并非所有数据都需要实时获取。
- 从关系出发思考——围绕数据之间的关联来设计查询。
- 性能优化不是魔法,而是系统化的分析和深思熟虑的解决方案。