Laravel关系查询需要很长时间

时间:2019-02-08 11:34:01

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

在我的数据库中有服务,交易和供应商调整表。服务表有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();

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

2 个答案:

答案 0 :(得分:0)

使用此:

$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();

答案 1 :(得分:0)

我发现您的查询没有问题。问题可能是您在数据库上缺少特定的索引。我认为是因为whereDate('created_at', $queryDate)会转换为WHERE DATE(created_at) >= '$queryDate',而后者必须先从表中的所有时间戳记/日期时间记录中提取实际日期,然后才能执行比较。在created_at列上添加索引将使数据库的工作更加轻松,尽管它对插入,更新和删除有轻微影响。

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