我在 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 次
  • 服务器负载显著降低
  • 用户体验更佳

关键要点

  • 优化前一定要先分析——不要盲目猜测瓶颈所在。
  • 预加载是好帮手,但也要避免把所有关联都一次性预加载。
  • 明智地使用缓存——并非所有数据都需要实时获取。
  • 从关系出发思考——围绕数据之间的关联来设计查询。
  • 性能优化不是魔法,而是系统化的分析和深思熟虑的解决方案。
Back to Blog

相关文章

阅读更多 »