我正在使用此脚本来交叉引用数据,以便可以从数据库中检索正确的数据,这需要进行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);
使用此命令我的内存不足了
我尝试将内存限制从256M增加到3GB,并且仍然无法使用内存
我正在使用wordpress,因此$wpdb
是wordpress用于与数据库进行交互的类
我需要交叉引用提取的数据以获取我们想要的功能所需的信息,是否有任何方法可以减少它试图使用的内存,或者我缺少的代码中存在一些错误? ?
编辑:
该脚本在行array_push($groupMemberList,$ggm[$x]->user_id);
答案 0 :(得分:4)
SELECT * FROM wp_gmw_locations WHERE region_code='$state'
如果仅需要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
查询变成一个查询。
,您只需要ID?然后进一步优化您的选择!
SELECT user_id FROM wp_bp_groups_members WHERE group_id IN
(SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')
这将大大减少您的内存占用量 和执行时间。您应该能够从这里获取并改进其余代码。我建议旋转一个SQL控制台,并进行一些操作,以便您了解数据库可以为您做些什么-很多!在过去的几年中,我没有遇到任何数据检索任务,仅通过一个查询就无法解决。
顺便说一句:看一下foreach循环,与for循环相比,它们使代码更加优雅。