Как оптимизировать код php (ускорить обработку)?
Как оптимизировать эту часть кода? Очень медленно отрабатывает сейчас.
// выбор данных из бд, все строки из таблицы "Декларации". (2000 строк)
$table_dec_id = "1090"; // id таблицы "Декларации"
$result_dec = data_select($table_dec_id, 'status = 0');
// выбор данных из бд, все строки из таблицы "Поиск вхождений". (400 строк)
$table_key_id = "1160"; // id таблицы "Поиск вхождений"
$result_key = data_select($table_key_id, 'status = 0');
// перебираем все строки из таблицы "Декларации"
while ($row_dec = sql_fetch_assoc($result_dec)) {
$adress = '';
$adress = $row_dec['f18810']; // f18810 - поле Адрес для региона
$record_key = '';
// перебираем все записи из таблицы "Поиск вхождений", проверяя что находится в поле Адрес для региона: f17750
while ($row_key = sql_fetch_assoc($result_key)) {
//f18770 - поле "Ключевая фраза" таблицы "Поиск вхождений"
//f18780 - поле "Регион" таблицы "Поиск вхождений"
if (mb_stripos($adress, $row_key['f18770']) !== false) {
$record_key = $row_key['f18780'];
}
}
// если хоть какое-то вхождение сработало, то...
if ($record_key != '') {
// записываем результат в поле Регион, в таб."Декларации" (f17970)
data_update(1090, EVENTS_ENABLE, ['f17970' => $record_key], 'id = ', $row_dec['id']);
}
}
Ответы (1 шт):
Автор решения: teran
→ Ссылка
Судя по php коду, вам нужен примерно такой запрос обновления данных
UPDATE dec
INNER JOIN res ON (
res.status = 0
AND dec.f18810 LIKE CONCAT('%', res.f18770, '%')
)
SET dec.f17970 = res.f18780
WHERE dec.status = 0
Однако немного не ясно, что происходит, если совпадений нашлось больше чем одно. В случае пхп, перезаписывается последним найденным. Однако порядок сортировки не ясен. В целом такое поведение можно реализовать и на уровне СУБД.
Возможно предварительно придется выбрать данные с группировкой/фильтрацией данных используя временные таблицы/цте или оконные функции, и получив по одной строке для обновления без повторов обновить таблицу по этому набору. Но тут для конкретики нужно знать СУБД и ее версию.