Ускорить магазин на Опенкарте - WT-SHOP.RU
Есть интернет магазин на CMS опенкарт, в нём более 14000 категорий и 250000
товаров, которые обновляются каждые сутки. Поэтому кэширование здесь не
поможет.
Задержки загрузки страниц возникают из-за долгого ожидания ответа MySQL
сервера.
При небольшой посещаемости все SQL запросы выполняются быстро, кроме одного
типа:
SELECT DISTINCT SQL_CALC_FOUND_ROWS p.product_id, (SELECT AVG(rating) AS
total FROM oc_review r1 WHERE r1.product_id = p.product_id AND r1.status =
'1' GROUP BY r1.product_id) AS rating, (SELECT price FROM
oc_product_discount pd2 WHERE pd2.product_id = p.product_id AND
pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start =
'0000-00-00' OR pd2.date_start <:13:00') AND="" (pd2.date_end="<" p="">
'0000-00-00' OR pd2.date_end > '2015-06-30 11:13:00')) ORDER BY pd2.priority
ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM
oc_product_special ps WHERE ps.product_id = p.product_id AND
ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR
ps.date_start <:13:00') AND="" (ps.date_end="0000-00-00" OR="" <="" p="">
ps.date_end > '2015-06-30 11:13:00')) ORDER BY ps.priority ASC, ps.price ASC
LIMIT 1) AS special FROM oc_product_to_category p2c LEFT JOIN oc_product p
ON (p2c.product_id = p.product_id) LEFT JOIN oc_product_description pd ON
(p.product_id = pd.product_id) WHERE p.status = '1' AND p2c.category_id =
'1913' GROUP BY p.product_id ORDER BY p.sort_order ASC, LCASE(pd.name) ASC
LIMIT 0,16
занимает 1.6 с.
Урезание запроса от рейтинга, скидок и тд. значительного ускорения не даёт,
дело в количестве товара.
Увеличение серверных мощностей, также не приводит к заметному ускорению.
Проблема возникает при большой посещаемости, когда несколько таких запросов
обрабатываются одновременно, время ответа БД увеличивается прогрессивно,
запросы продолжают накладываться, и скоро даже десятки других "бывших
мгновенных" SQL запросов занимают по 10-20 мин.
Видимо, нужно изменение взаимодействия с MySQL сервером - модернизация
структуры таблиц, и ядра магазина, для избавления от таких тяжёлых SQL
запросов.
Нужно, чтобы по завершении работы, всё части магазина с установленными
модулями работали без глюков.