Publish your project for free and start receiving offers from freelance contractors in serveral minutes after publication!
1 500 ₽

Оптимизировать медленные запросы к БД Opencart

closed without completion


Категории открываются долго из-за этого запроса:
Info: SELECT 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 < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) 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 < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special FROM oc_category_path cp LEFT JOIN oc_product_to_category p2c ON (cp.category_id = p2c.category_id) 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) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '1' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '0' AND cp.path_id = '6562' GROUP BY p.product_id ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END) ASC, LCASE(pd.name) ASC LIMIT 0,102

Это проблема CMS, у данной CMS это постоянная проблема, так как в ней используются неоптимизированные sql запросы. В частности этот выполняется 11 секунд и перебирает 224 тысячи строк:
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: p2s
partitions: NULL
type: ref
possible_keys: PRIMARY,product_id,store_id
key: store_id
key_len: 4
ref: const
rows: 224043
filtered: 100.00
Extra: Using index; Using temporary; Using filesort

Нужно оптимизировать данный запрос, так как выборка делается из таблицы oc_product_to_store в которой 2 поля и проставление индексов не поможет.