mak_
Новичок
Добрый день.
Есть таблица с товарами, в которой указан текущий остаток.
Есть вторая таблица с заданиями на обновление информации о товаре на сайте.
Надо выбрать все товары, у которых нет успешных заданий на обновление или количество товара в последнем успешном задании не совпадает с текущим количеством.
Используемый запрос выполняется очень долго, вплоть до 500-600 секунд (сейчас товаров 20000, записей в логе обновления по нескольку десятков на товар).
Как его можно оптимизировать?
Алгоритм: все товары объединяем с подтаблицей логов, в которой оставлены только последние успешные записи выгрузки. Из полученных строк оставляем только с не совпадающим количеством или те у кого нет успешных выгрузок.
таблица t310 - содержит товар
таблица t380 - логи выгрузки на сайт, связь с товарами по полю id_l_n.
Есть таблица с товарами, в которой указан текущий остаток.
Есть вторая таблица с заданиями на обновление информации о товаре на сайте.
Надо выбрать все товары, у которых нет успешных заданий на обновление или количество товара в последнем успешном задании не совпадает с текущим количеством.
Используемый запрос выполняется очень долго, вплоть до 500-600 секунд (сейчас товаров 20000, записей в логе обновления по нескольку десятков на товар).
Как его можно оптимизировать?
Код:
SELECT DISTINCT t310.id as id_n,
t310.n as name,
t310.kol as kol,
supplier_log.*
FROM
#номенклатура
t310
#последнее успешное задание обновления или NULL
LEFT JOIN (SELECT t380.*
FROM
t380
JOIN (SELECT
t380.id_l_n,
max(t380.id) as `id_max`
FROM
t380
WHERE
t380.status = 0 AND
t380.tip = 'kol' AND
t380.stat = 'успех'
GROUP BY
t380.id_l_n
) as tmp_supplier_log
ON t380.id = tmp_supplier_log.id_max
) as supplier_log
ON t310.id = supplier_log.id_l_n
WHERE
t310.kol <> supplier_log.value OR
supplier_log.id_l_n IS NULL
таблица t310 - содержит товар
таблица t380 - логи выгрузки на сайт, связь с товарами по полю id_l_n.