@wonderatom

Как правильно оптимизировать работу php и mysql с двумя БД?

Пишу биллинговую систему для небольшого интернет провайдера. В следствии определенных причин для обработки абонентов необходимы данные сразу из двух БД одновременно.
Я сделал следующим образом:
  • Делаю запрос к первой базе, получаю 16000 строк и записываю их в массив:
    array(16000) {
      '0689182' =>
      array(19) {
        'id' =>
        string(5) "25491"
        'agrm_id' =>
        ...
        'vg_id' =>
        string(8) "1323"
        'rec' =>
        string(1) "0"
      }
    ...
    }

  • Прохожу весь массив записываю уникальные id в строку, чтобы потом сделать точную выборку со второй БД;
    foreach($basesData as $user) {
                $strAgrmId .= $user['agrm_id'] . ',';
            }

  • Делаю запрос к второй базе, и получаю 16000 строк с дополнительной информацией:
    $sql = "SELECT
                    number,
                    balance,
                    credit
                FROM
    	            agreements
                WHERE agrm_id IN(" . substr($strAgrmId, 0, -1) . ")";

    array(16000) {
      '0689182' =>
      array(19) {
        'balance' =>
        string(5) "25491"
        'credit' => 
        string(1) "0"
      }
    ...
    }

  • Объединяю;
    foreach($basesData as $key => $user) {
                $users[$key] = array_merge($basesData[$key], $agrmData[$key]);
            }


Дальше по алгоритму я проделываю похожую манипуляцию с выборкой информации для определения статуса и снова перебираю весь массив юзеров:
foreach($users as $key => $user) {

            ..code..

            foreach($arrayPool as $one) {
                        ..code..
                        $users[$key]['status'] = $one['status'];
            }
        }

Вложенный foreach работает с массивами длинной 20-30. Но в результате чтобы обработать и собрать всю необходимую инфрмацию в один массив необходимо очень много времени. На моем ПК за 15 минут скрипт не дорабатывает.
От сюда первый вопрос: как правильно организовать оптимизацию в подобном случае?
И второй: у меня есть подозрение, что этот алгоритм - полный бред. И думаю, что возможен вариант сборки той же информацию но используя другой алгоритм.
  • Получаю первый массив с 16000 записей;
  • Начинаю перебирать массив и при этом для каждого из юзеров делаю отдельный запрос для поиска дополнительной информации, потом делаю еще один запрос для поиска и обработки статуса;
  • Добавляю для каждого отдельного юзера найденную информацию и продолжаю алгоритм.

Заранее спасибо!
  • Вопрос задан
  • 2392 просмотра
Пригласить эксперта
Ответы на вопрос 2
@IceJOKER
Web/Android developer
Можно же в одном запросе обратиться к двум БД, если пользователь имеет доступ - dbName.dbTable.dbField

stackoverflow.com/questions/4076562/query-with-joi...
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Не знаю вашего уровня знаний, так что на всякий случай переспрошу: именно две разные базы или только таблицы? Эти две вещи иногда путают.

Профилируйте, где в реальности теряете время. У нынешнего zend engine довольно странный менеджмент памяти, который будет основательно оптимизирован в php7, но смерждить всего-то 16тыс записей - фигня вопрос покуда памяти хватает.
Можно как-нибудь извратить логику обработки с ног на голову - но для этого надо понимать, что надо сделать в итоге (при том, длинные сочинения читать будет лениво).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽