Добрый вечер!
Столкнулся с проблемой долгого отклика сайта на страницах которого отображеется 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) Как можно видеть, запросы были выполнены приблизительно за одно из то же время, однако во втором случае запрос был выполнен одновременно для четырех уникальных значений. Таким образом, корректно сгруппировав запросы можно будет добиться оптимальной работы сайта.
Как можно решить данную проблему?