Уменьшите использование памяти для больших вызовов базы данных php - PullRequest
4 голосов
/ 13 марта 2019

Я использую этот сценарий для перекрестной ссылки на данные, чтобы я мог получить нужные данные из базы данных, для чего требуется 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 использует для взаимодействия с базой данных

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

EDIT: Скрипту не хватает памяти на строке array_push($groupMemberList,$ggm[$x]->user_id);

1 Ответ

4 голосов
/ 13 марта 2019
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 user_id FROM wp_bp_groups_members WHERE group_id IN
  (SELECT object_id FROM wp_gmw_locations WHERE region_code='$state')

, который должен значительно сократить объем используемой памяти и время выполнения.Вы должны иметь возможность взять его отсюда и улучшить оставшуюся часть кода.Я рекомендую развернуть SQL-консоль и просто немного поиграть, чтобы вы почувствовали, что база данных может сделать для вас - это довольно много!За последние несколько лет я не сталкивался с какой-либо задачей по поиску данных, которую я не смог бы решить всего лишь с помощью одного запроса.

, кстати: взгляните на foreach -loops, они делают код довольно элегантным по сравнению с for-loop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...