【问题标题】:Laravel relational query takes a long timeLaravel 关系查询需要很长时间
【发布时间】:2019-07-02 15:28:12
【问题描述】:

在我的数据库中有服务、交易和供应商调整表。服务表有 23 行,交易表有超过 20 万行,供应商调整表有 30000 行。

我的查询是

$transactions = Service::withCount(['transactions as totalOrder','transactions as amount' =>
 function($query) use ($queryDate){
    $query->whereIn('status',['Success','Pending','Successful','Processing']);
    $query->whereDate('created_at','>=', $queryDate);
    $query->select(DB::raw('SUM(deducted)'));
},'vendorAdjustment as adjustmentPoint' => function($query) use ($queryDate){
    $query->whereDate('created_at','>=', $queryDate);
    $query->select(DB::raw("SUM(amount)"));
}])->get();

现在我上面的查询需要很长时间。我不明白如何优化它。

【问题讨论】:

    标签: laravel laravel-5 laravel-4 eloquent laravel-5.2


    【解决方案1】:

    使用这个:

    $transactions = Service::withCount(['transactions as totalOrder','transactions as amount' =>
            function($query) use ($queryDate){
                $query->whereIn('status',['Success','Pending','Successful','Processing']);
                $query->whereDate('created_at','>=', $queryDate);
            },'vendorAdjustment' => function($query) use ($queryDate){
            $query->whereDate('created_at','>=', $queryDate);
        }])->get();
    

    【讨论】:

    • 这应该如何产生预期的结果?
    • 如何获取交易表扣除列的总和?
    • @LaraDevelopment 这里要统计关系数据对吧?
    • @LaraDevelopment 在您的查询中尝试将 withCount 替换为 with 并且对于 count 您必须添加另一个方法。
    【解决方案2】:

    我看不出您的查询有什么问题。问题可能是您的数据库缺少特定的索引。我想是因为whereDate('created_at', $queryDate) 将转换为WHERE DATE(created_at) >= '$queryDate',它必须从表中的所有时间戳/日期时间记录中提取实际日期,然后才能执行比较。在created_at 列上添加索引将使数据库的任务更容易,尽管它对插入、更新和删除有轻微影响。

    因此我的最佳猜测是:为transactions.created_attransactions.statusvendor_adjustments.created_at 添加索引。

    【讨论】:

      猜你喜欢
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 2018-01-09
      相关资源
      最近更新 更多