Здравствуйте, как можно оптимизировать данный код (ускорить его выполнение) Короткая информация по коду: pdo - Это бд сайта $pdo2 - Это бд сервера $limit_man ->Кол-во людей которое мне нужно Сам код рабочий, использует запросы pdo (слегка изменёные создателем движка) Сам код: PHP: $top_users = []; $STH2 = $this->pdo->query("SELECT * FROM users WHERE gender = 1"); $STH2->setFetchMode(PDO::FETCH_OBJ); while ($row = $STH2->fetch()) { $STH3 = $pdo2->prepare("SELECT * FROM `lvl_atm` WHERE steam = :_steam_id"); $STH3->execute(array(':_steam_id' => $row->steam_id)); $STH3->setFetchMode(PDO::FETCH_OBJ); $user = $STH3->fetch(); if ($user) { $top_users[] = [ 'id' => $user->id, 'nick' => $user->name, 'kills' => $user->value, 'steam' => $row->steam_id ]; } } usort($top_users, function ($a, $b) { return $b['kills'] - $a['kills']; }); $top_three_users = array_slice($top_users, 0, $limit_man); foreach ($top_three_users as $user) { $sort[] = $user['steam']; } Логика работы или-же объяснение самого кода: Я сначала ищю всех пользователей на сайте кто выбрал определённый "гендер" на сайте, Потом перебираю данные из 2 бд (сервера) ищю данных игроков, добавляю в array массив $top_users И потом уже сортирую по "очкам", проблема в том что данных в таблице бд более 800-1к записей из-за чего код выполняеться мягко скажем медленно, интересуют идеи, замечания или-же готовое решение (если можно) по оптимизации кода. Сразу говорю нет возможности хранить все данные на 1 бд (из-за путаницы).Любые идеи\решения или-же критика с объяснениями одобряются.
У вас на каждую итерацию идёт запрос в БД, что очень дорого обходиться, вам нужно сформировать строку из '_steam_id' и сделать один запрос типа 'SELECT * FROM `level_atm` WHERE steam in(' . $ваша строка . ')' P.S. Строка должна быть такого формата '1, 2, 3, 4, 5'
медленно - потому что запросы в цикле - аццкое зло.... советую логику переделать так: 1. Запрос нужных пользователей из 1 бд 2. формируем массив/строку для запроса из 2 бд в условие WHERE steam IN(1,2,3,4,5) 3. Делаем второй запрос в 2 бд - причем сразу указываем сортировку.... зачем сортировать на PHP если это хорошо делает БД В итоге: 2 запроса... вместо 1+800-1к А по хорошему - пересмотреть архитекутру БД ... что во первых не разные БД были... а еще лучше - все сразу в одной таблице хранилось.. тогда вообще все сделается одним запросом
Чисто теоретически, в самом запросе возможно указывать базу и выполянть запрос к двум и более разным базам на одном сервере. Это админ должен подтвердить/настроить вам. В запросе вместо tablename указывать dbname.tablename, а вместо tablename.fieldname указывать dbname.tablename.fieldname Код (Text): SELECT o1.email AS email1, o2.email AS email2 FROM development.users AS o1 JOIN development2.users AS o2 ON o1.id = o2.id ORDER BY o1.id LIMIT 1 вот это две базы в одном запросе и оно работает. свой целевой запрос попробуй сочинить сам
А теперь внимание.... 8 строку с prepare выносишь перед циклом while и у автора появляется улыбка от ушей. Остальное мелочи, мне награду дарвина за исправление не дадут. --- Добавлено --- 24 - 30 строку вообще можно убрать и сделать это все одним запросом с добавлением как огласил @artoodetoo