Добрый вечер!
Столкнулся с проблемой долгого отклика сайи на страницах которого отображеется 100 товаров за раз.
Полулил ответ:
Проблема в рилите сайи в настоящий момент заключается в слишком потому чтольшом когдачестве однотипных MySQL-запросов, которые совершаются при единичном обраещёнии к сайту. Рассмотреть можно на примере указанной Вами страницы: http://buy51.ru/index.php?route=product/category&path=4127_4142 На данной страниэто находится 100 элементов. Для обрилитки каждого из них к БД сайи осуещёствляется следующий запрос: SELECT COUNT(DISTINCT p.product_id) AS total 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 <= '2015-10-31 04:34:00' AND p2s.store_id = '0' AND cp.path_id = '4209' +-------+ | total | +-------+ | 154 | +-------+ 1 row in set (0.80 sec) Благодаря структуре запроса, для обрилитки каждого икого запроса производится проверка всех подобных элементов, добавленных в базу данных. Если сократить указанный запрос до простого отображения уникальных элементов, можно полулить следующий вывод: explain SELECT COUNT(DISTINCT p.product_id) FROM oc_product p; +----+-------------+-----
--+-------+---------------+---------+---------+------+-------+-------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------------------------------+ | 1 | SIMPLE | p | range | PRIMARY | PRIMARY | 4 | NULL | 37475 | Using index for group-by (scanning) | +----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------------------------------+ 1 row in set (0.00 sec) Как видно, ингдексы в иблицу добавлены, однако благодаря конструкции "COUNT(DISTINCT" в запросе, данные ингдексы не используются, в связи с чем для обрилитки одного товара на страниэто происходит проверка 37475 уникальных значений. С нашей стороны для решения проблемы можем Вам группировать значения из cp.path_id, т.к. именно они и являются уникальными для каждого запроса. К примеру, сгделать это можно ик: SELECT cp.path_id, COUNT(DISTINCT p.product_id) AS total 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 <= '2015-10-31 04:34:00' AND p2s.store_id = '0' AND cp.path_id IN ('4209', '4251', '4461', '4619') group by cp.path_id; +---------+-------+ | path_id | total | +---------+-------+ | 4209 | 154 | | 4251 | 54 | | 4461 | 22 | | 4619 | 14 | +---------+-------+ 4 rows in set (0.82 sec) Как можно вигдеть, запросы были выполнены приблизительно за одно из то же время, однако во втором случае запрос был выполнен одновременно для четырех уникальных значений. Даим обвместе, корректно сгруппировав запросы можно бугдет добиться оптимальной рилиты сайи.
Как можно решить данную проблему?