减少大型数据库调用php的内存使用

时间:2019-03-13 19:47:16

标签: php wordpress

我正在使用此脚本来交叉引用数据,以便可以从数据库中检索正确的数据,这需要进行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);

中的内存不足

1 个答案:

答案 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循环相比,它们使代码更加优雅。