@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тыс записей - фигня вопрос покуда памяти хватает.
Можно как-нибудь извратить логику обработки с ног на голову - но для этого надо понимать, что надо сделать в итоге (при том, длинные сочинения читать будет лениво).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы