Оптимизировать скрипт рекомендуемых товаров

7

Смотрю запросы, которые медленно выполняются.

Наткнулся на запрос показа рекомендуемых товаров:

SELECT DISTINCT p.*,p.id,alsobought.orders_count,(p.count > 0 || p.count IS NULL) AS in_stock
FROM shop_product p
	JOIN (SELECT oi1.product_id, COUNT(*) orders_count FROM shop_order_items oi1
                JOIN (
                  SELECT order_id FROM shop_order_items WHERE product_id = 1857 ORDER BY id DESC LIMIT 2000
                ) t ON oi1.order_id = t.order_id
                WHERE oi1.product_id != 1857 AND oi1.type = "product"
                GROUP BY oi1.product_id
                ORDER BY orders_count DESC
                LIMIT 50) alsobought
		ON p.id = alsobought.product_id
WHERE (p.count > 0 OR p.count IS NULL)
	AND p.status = 1
ORDER BY in_stock DESC,alsobought.orders_count DESC, p.id
LIMIT 8;

1. Получается, что такой запрос выполняется для каждой карточки товара, что замедляет вычисление. Кроме того есть определенные запилы (limit 2000, limit 50), которые ограничивают отображение в случае, если часть товаров недоступны к заказу.

Например, выбралось 2000 последних заказанных товаров вместе с нужным. Из них подсчиталось 50 самых популярных товаров. Из этих товаров выбрались 8 товаров, которые есть в наличии. А у меня в карточке из 50 товаров доступны сейчас только 1. Пользователю показывается 1 рекомендуемый товар. Думаю, стоит проверять доступные товары на этапе выборке с limit 2000, чтобы такого не происходило.

2. В идеале кешировать такие запросы например раз в день и складывать в отдельную таблицу один к множеству вида: дата, товар, рекомендуемый товар. Тогда будет моментально отрабатывать. И дать возможность включить такое кеширование в режиме работы и в режиме cron.

2 комментария

  • +1
    Nikolai Nikolai 20 сентября 2020 12:51 #

    А в каком файле формируется данный скрипт? Хочу попровать подобрать оптимальный вариант.

    Добавить комментарий

    Чтобы добавить комментарий, зарегистрируйтесь или войдите