Имеется интернет-магазин канцелярии, 17500 позиций номенклатуры. Магазин очень долго работает. Все тормозит.
Улучшение сервера результата не дало.
Отключение подсчета кол-ва товаров, добавление индексов - не принесло ощутимой пользы.
Все страницы очень долго грузятся.
Тормозит все MySQL, поскольку в Opencart очень большие запросы, с множествой вложений и ORDER BY.
Сейчас база MyIsam, где-то читал, что на InnoDB не советуют переводить OpenCart.
В последнее время очень часто стали приходить отчеты по Яндекс.Метрике, что сайт недоступен.
Кеширование Memcache включено - не помогает.
Как можно его оптимизировать?
Или на какой другой движок можно перейти? чтобы быстро и с минимальными затратами.
Часто выполняемый медленный запрос MySQL
Count: 46 Time=6.91s (317s) Lock=0.05s (2s) Rows=1.0 (46),
SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer,
(SELECT price
FROM oc_product_discount pd2
WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = 'S'
AND pd2.quantity = 'S' AND ((pd2.date_start = 'S' OR pd2.date_start < 'S')
AND (pd2.date_end = 'S' OR pd2.date_end > 'S'))
ORDER BY pd2.priority ASC, pd2.price ASC LIMIT N) AS discount,
(SELECT price
FROM oc_product_special ps
WHERE ps.product_id = p.product_id AND ps.customer_group_id = 'S'
AND ((ps.date_start = 'S' OR ps.date_start < 'S') AND (ps.date_end = 'S' OR ps.date_end > 'S'))
ORDER BY ps.priority ASC, ps.price ASC LIMIT N) AS special,
(SELECT points
FROM oc_product_reward pr
WHERE pr.product_id = p.product_id AND customer_group_id = 'S') AS reward,
(SELECT ss.name
FROM oc_stock_status ss
WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = 'S') AS stock_status,
(SELECT wcd.unit
FROM oc_weight_class_description wcd
WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = 'S') AS weight_class,
(SELECT lcd.unit
FROM oc_length_class_description lcd
WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = 'S') AS length_class,
(SELECT AVG(rating) AS total
FROM oc_review r1
WHERE r1.product_id = p.product_id AND r1.status = 'S'
GROUP BY r1.product_id) AS rating,
(SELECT COUNT(*) AS total
FROM oc_review r2
WHERE r2.product_id = p.product_id AND r2.status = 'S'
GROUP BY r2.product_id) AS reviews,
p.sort_order FROM oc_product p
LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id)
LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id)
LEFT JOIN oc_manufacturer m ON (p.manufacturer_id = m.manufacturer_id)
WHERE p.product_id = 'S' AND p.status = 'S' AND p.date_available <= 'S' AND p2s.store_id = 'S'