减少大型数据库调用php的内存使用
我使用这个脚本来交叉引用数据,以便从数据库中检索正确的数据,该数据库需要3个检查,其中2个在for循环中运行减少大型数据库调用php的内存使用,php,wordpress,Php,Wordpress,我使用这个脚本来交叉引用数据,以便从数据库中检索正确的数据,该数据库需要3个检查,其中2个在for循环中运行 $state=str\u replace(“,”,$state); $state=str_replace(“,”,$state); $getStateGroups=$wpdb->get_results(“从wp_gmw_位置选择*,其中区域代码=“$state”); $groupIdList=array(); 对于($i=0;$iobject\u id); } $groupMemberL
$state=str\u replace(“,”,$state);
$state=str_replace(“,”,$state);
$getStateGroups=$wpdb->get_results(“从wp_gmw_位置选择*,其中区域代码=“$state”);
$groupIdList=array();
对于($i=0;$iobject\u id);
}
$groupMemberList=array();
对于($i=0;$iget_results(“从wp_bp_groups_成员中选择*,其中group_id=“.$groupIdList[$i]);
对于($x=0;$x用户id);
}
}
$whereList=内爆(“,”,$groupMemberList);
$userGameData=$wpdb->get_results(“从用户_game_数据中选择*,其中uid在($whereList)中,按生命周期的顺序排列\u keys\u dusped DESC”);
返回内爆(“,”,$groupIdList);
使用这个我的内存不足
我已经尝试将内存限制从256M增加到3GB,但它仍然没有内存
我正在使用wordpress,因此,$wpdb
是wordpress用来与数据库交互的类
我需要交叉引用拉取的数据,以获得我们想要的功能所需的信息。是否有任何方法可以减少这正试图使用的内存,或者在我缺少的代码中是否存在一些bug
编辑:
脚本在array\u push($groupMemberList,$ggm[$x]->user\u id)行内存不足代码>
如果您只需要ID,为什么要选择所有内容?(更不用说仅仅在其中解释$state会使您容易遭受SQL注入攻击,请仔细阅读准备好的语句。)
您的第一个改进是仅选择id:
SELECT object_id FROM wp_gmw_locations WHERE region_code='$state'
下一件事:您只将ID用于进一步的查询,否则您不会在代码中使用它们,对吗?
那么,为什么不让数据库来完成繁重的工作呢?它在这方面做得更好:
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循环相比,它们使代码变得非常优雅。当您声明$userGameData
和下一步返回$groupIdList
时,我感到困惑。我想你可以做一个查询,为你做所有这些you@kuh-chan出于测试目的,确保正确填充了$groupIdList
。请尝试此查询:(它不完美且未经测试)从用户游戏数据中选择*(从组id所在的wp_bp_groups_成员中选择用户id(从区域代码为“$state”的wp_gmw_位置中选择对象id))按生命周期\u键\u花费描述订购
SELECT user_id FROM wp_bp_groups_members WHERE group_id IN
(SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')