怀疑我已经有很长时间了。我曾经读过一遍,在逐一检查记录的情况下,在代码中使用循环要比通过SQL查询进行循环更快(对数据库的访问时间比循环慢),但是我我一直在测试某些逻辑,但事实并非如此。 (从查询到基础的数据获得的返回速度更快),那么在这些情况下最佳的方法是什么?
他们提到我的情况如下:
$payMethods = PayMethod::has('payments')->get();
$payments = collect();
foreach ($payMethods as $payMethod) {
$paid = 0;
if ($payMethod->bankProvider->provider->type == 1) {
foreach ($payMethod->payments as $payment) {
$paid += $payment->price;
}
}
$payments[$payMethod->name] = $paid;
}
return response()->json($payments);
使用sql:
$payMethods = PayMethod::has('payments')->get();
$payments = collect();
foreach ($payMethods as $payMethod) {
$sql = 'SELECT ROUND(SUM(a.price), 2) AS amount FROM payments a
JOIN paymethods b ON a.paymethod_id = b.id
JOIN bank_provider c ON b.bank_provider_id = c.id
JOIN providers d ON c.provider_id = d.id
WHERE d.`type` = 1 AND a.paymethod_id = :paymethod_id AND a.deleted_at IS NULL';
$paid = DB::select($sql, ['paymethod_id' => $payMethod->id]);
$payments[$payMethod->name] = $paid[0]->amount;
}
return response()->json($payments);
注意:测试是在chrome中进行的,并且区别明显在于支持sql的逻辑(与循环相比减少了5至6秒)。
答案 0 :(得分:2)
基本上,发送一个查询比发送多个查询更好,因为mysql服务器的成本和响应时间,但是在您的情况下,您正在使用某种ORM,并且由于延迟加载,您可能将拥有N + 1(或更糟糕的是)查询(您可以阅读有关内容)