Уменьшите использование памяти для вызовов больших баз данных php

#php #wordpress

#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);
  

используя это, у меня заканчивается память

Я попытался увеличить свой лимит памяти с 256 МБ до 3 ГБ, и он по-прежнему исчерпывает память

Я использую WordPress, поэтому $wpdb это класс, который wordpress использует для взаимодействия с базой данных

Мне требуется перекрестно ссылаться на извлеченные данные, чтобы получить информацию, необходимую для нужной нам функциональности, есть ли какой-либо способ уменьшить объем памяти, который это пытается использовать, или есть какая-то ошибка в коде, которую я пропускаю?

РЕДАКТИРОВАТЬ: Скрипту не хватает памяти в строке array_push($groupMemberList,$ggm[$x]->user_id);

Комментарии:

1. Я в замешательстве, поскольку вы объявляете $userGameData и на следующем шаге возвращаете $groupIdList . Я думаю, вы могли бы создать один запрос, который сделает все это за вас

2. @kuh-chan Это было в целях тестирования, чтобы убедиться, что $groupIdList заполняется правильно

3. попробуйте этот запрос: (он не идеален и не протестирован) select * from user_game_data where uid in ( select user_id from wp_bp_groups_members where group_id in ( select object_id from wp_gmw_locations where region_code = '$state' ) ) order by lifetime_keys_spent desc

Ответ №1:

 SELECT * FROM wp_gmw_locations WHERE region_code='$state'
  

если вам нужны только идентификаторы, почему вы выбираете все? (не говоря уже о том, что простая интерпретация $ state там делает вас подверженным атакам SQL-инъекций, прочитайте подготовленные инструкции.)

вашим первым улучшением будет только выбор идентификатора:

 SELECT object_id FROM wp_gmw_locations WHERE region_code='$state'
  

следующее: вы используете идентификаторы только для дальнейших запросов, иначе вы не используете их в своем коде, верно?
тогда почему бы не позволить базе данных выполнять тяжелую работу, у нее это получается намного лучше:

 SELECT * FROM wp_bp_groups_members WHERE group_id IN
  (SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')
  

который не только избавляет от всех этих затрат памяти, но и превращает n 1 запросы к базе данных в один.

опять же, вам нужен только идентификатор? затем доработайте свой select!

 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.