在我的数据库中有服务,交易和供应商调整表。服务表有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();
现在我上面的查询需要很长时间。我不知道如何优化它。
答案 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_at
,transactions.status
和vendor_adjustments.created_at
添加索引。