【发布时间】:2019-11-05 07:08:44
【问题描述】:
我的 Laravel 网站出现了一些性能问题。 我能够发现原因是我的代码的一部分。 我在一个循环中进行查询,正如我刚刚发现的那样,不应该这样做。 我不确定如何以最佳方式优化此代码(无需更改数据库,因为在项目的这个阶段这并不容易)。
我正在考虑使用 foreach $transactionInfos 至少有点像这样改进部分,但我现在不确定 Laravel 语法:
$transactionInfos = ToolTransactionInfo::where('tool_id', $tool->id)
->where('date', $date)
->only(['users'])
//->get();
->all();
if(!empty($transactionInfos)) {
$users = array_sum($transactionInfos);
}
else{
$users = 0;
}
实际代码:
foreach ($data['tools'] as $tool) {
// 30 day user graph data
$count = 30;
$tool_users_30d[$tool->id] = [];
while ($count > 0) {
$date = Carbon::now()->subDays($count)->format('Y-m-d');
$transactionInfos = ToolTransactionInfo::where('tool_id', $tool->id)
->where('date', $date)
->get();
$users = 0;
foreach ($transactionInfos as $transactionInfo) {
$users += $transactionInfo->users;
}
array_push($tool_users_30d[$tool->id], $users);
$count--;
}
}
$data['tool_users_30d'] = $tool_users_30d;
我希望得到一个包含所有工具列表的数组,其中包含每个 30 天用户数据的数组,例如:
- [13][0] = 20
- [13][1] = 6
- [13][2] = 24
- ..
[13][29] = 10
..
[18][0] = 50
- [18][1] = 11
- [18][2] = 55
- ..
- [18][29] = 6
https://i.imgur.com/VDyZ9uN.png (示例图像显示 0 个用户,因为本地数据库为空,但它应该是这样的)。
【问题讨论】:
-
向我们展示生成的 SQL,以便我们从那方面解决问题。
-
我在创建统计数据时遇到了类似的问题。我通过缓存结合生成的命令和调度来解决它。你知道过去的数据不会改变。如果当前日期发生变化,请在 multidim 数组中的特定位置调整缓存数据并重新保存缓存。这可以通过结合队列创建事件来完成。在午夜运行 30 天计划。如果缓存(d数组)太大,你可以将它保存为文件。
标签: php mysql laravel optimization query-optimization