我使用这个脚本交叉引用数据,以便从数据库中检索正确的数据,这需要3次检查,其中2次在for循环中运行。
$state = str_replace("<span>","",$state);
$state = str_replace("</span>","",$state);
$getStateGroups = $wpdb->get_results("SELECT * FROM wp_gmw_locations WHERE region_code='$state'");
$groupIdList = array();
for($i = 0; $i < count($getStateGroups); $i++){
array_push($groupIdList,$getStateGroups[$i]->object_id);
}
$groupMemberList = array();
for($i =0; $i < count($groupIdList);$i++){
$ggm = $wpdb->get_results("SELECT * FROM wp_bp_groups_members WHERE group_id=" . $groupIdList[$i]);
for($x = 0; $x < count($ggm); $i++){
array_push($groupMemberList,$ggm[$x]->user_id);
}
}
$whereList = implode(',',$groupMemberList);
$userGameData = $wpdb->get_results("SELECT * FROM user_game_data WHERE uid IN ($whereList) ORDER BY lifetime_keys_spent DESC");
return implode(',',$groupIdList);使用这个,我的内存就用完了。
我试着把我的内存限制从256米提高到3GB,但是内存不足。
我使用wordpress,所以$wpdb是wordpress用来与数据库交互的类
我需要交叉引用数据,以获得我们想要的功能所需的信息,有什么方法可以减少它试图使用的内存吗?还是代码中有我遗漏的错误?
编辑:脚本在行array_push($groupMemberList,$ggm[$x]->user_id);上耗尽内存
发布于 2019-03-13 20:03:16
SELECT * FROM wp_gmw_locations WHERE region_code='$state'如果您只需要if,为什么要选择所有的东西?(更不用说仅仅解释其中的$state就会使您容易受到SQL注入攻击,请阅读已准备好的语句。)
您的第一个改进将只是选择id:
SELECT object_id FROM wp_gmw_locations WHERE region_code='$state'下一步:您只在进一步的查询中使用in,否则不会在代码中使用它们,对吗?
那么,为什么不让数据库来做繁重的工作呢?
SELECT * FROM wp_bp_groups_members WHERE group_id IN
(SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')它不仅消除了所有的内存开销,而且还将n+1查询转换为一个数据库。
再说一遍,你只需要身份证?然后进一步完善你的选择!
SELECT user_id FROM wp_bp_groups_members WHERE group_id IN
(SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')这将大大减少内存占用和执行时间。您应该能够从这里获得它,并改进您的其余代码。我建议旋转一个SQL-控制台,只是稍微玩一下,这样您就可以感觉到数据库可以为您做什么-这是相当多!在过去的几年里,我没有遇到过任何数据检索任务,我只能用一个查询来解决问题。
顺便说一句:看看前程-loops,与for-循环相比,它们使代码变得相当优雅。
https://stackoverflow.com/questions/55150123
复制相似问题