Пишу биллинговую систему для небольшого интернет провайдера. В следствии определенных причин для обработки абонентов необходимы данные сразу из двух БД одновременно.
Я сделал следующим образом:
- Делаю запрос к первой базе, получаю 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 записей;
- Начинаю перебирать массив и при этом для каждого из юзеров делаю отдельный запрос для поиска дополнительной информации, потом делаю еще один запрос для поиска и обработки статуса;
- Добавляю для каждого отдельного юзера найденную информацию и продолжаю алгоритм.
Заранее спасибо!