Как оптимизировать код 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

Однако немного не ясно, что происходит, если совпадений нашлось больше чем одно. В случае пхп, перезаписывается последним найденным. Однако порядок сортировки не ясен. В целом такое поведение можно реализовать и на уровне СУБД.
Возможно предварительно придется выбрать данные с группировкой/фильтрацией данных используя временные таблицы/цте или оконные функции, и получив по одной строке для обновления без повторов обновить таблицу по этому набору. Но тут для конкретики нужно знать СУБД и ее версию.

→ Ссылка