首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少大型数据库调用php的内存使用量

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

Stack Overflow用户
提问于 2019-03-13 19:47:16
回答 1查看 588关注 0票数 4

我使用这个脚本交叉引用数据,以便从数据库中检索正确的数据,这需要3次检查,其中2次在for循环中运行。

代码语言:javascript
复制
$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);上耗尽内存

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-13 20:03:16

代码语言:javascript
复制
SELECT * FROM wp_gmw_locations WHERE region_code='$state'

如果您只需要if,为什么要选择所有的东西?(更不用说仅仅解释其中的$state就会使您容易受到SQL注入攻击,请阅读已准备好的语句。)

您的第一个改进将只是选择id:

代码语言:javascript
复制
SELECT object_id FROM wp_gmw_locations WHERE region_code='$state'

下一步:您只在进一步的查询中使用in,否则不会在代码中使用它们,对吗?

那么,为什么不让数据库来做繁重的工作呢?

代码语言:javascript
复制
SELECT * FROM wp_bp_groups_members WHERE group_id IN
  (SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')

它不仅消除了所有的内存开销,而且还将n+1查询转换为一个数据库。

再说一遍,你只需要身份证?然后进一步完善你的选择!

代码语言:javascript
复制
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-循环相比,它们使代码变得相当优雅。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55150123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档