Перейти к содержанию
qyyyyyy123

[Решено] Очень долгий отклик сайта

Рекомендуемые сообщения

Добрый вечер!

Столкнулся с проблемой долгого отклика сайта на страницах которого отображеется 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)

Как можно видеть, запросы были выполнены приблизительно за одно из то же время, однако во втором случае запрос был выполнен одновременно для четырех уникальных значений. Таким образом, корректно сгруппировав запросы можно будет добиться оптимальной работы сайта.

 

Как можно решить данную проблему?

Изменено пользователем qyyyyyy123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) кэширование

2) вырубить подсчет количества товаров в категории

3) откорректировать p.date_available <= '2015-10-31 04:34:00' чтоб mysql мог сам кэшировать нормально

4) обратиться к специалистам, чтоб они сами решили.

5) дать премию сисадмину хостинга за такую подробную попытку описать проблему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1)Хостинг поддерживает APC и XCache какой лучше использовать?

2) вырубить подсчет количества товаров в категории (выключен)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Версия?

 

Подсчет количества может происходить в разных местах

Например в модуле категорий

В меню на главной

В контроллере категорий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

journalmenu - к авторам модуля.. или самостоятельно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

опенкарт Версия 1.5.5.1.2

Подсчет количества товаров я отключал через Настройки

Тут:

Количество товаров в подкатегории:
Показать количество товаров в подкатегории в категории меню заголовка магазина. Будьте осторожны, это может вызвать излишнюю нагрузку в производительности для магазинов с большим количеством подкатегорий

 

PS данная проблема появилась недавно, до этого сайт стабильно работал целый год.

Изменено пользователем qyyyyyy123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1)Хостинг поддерживает APC и XCache какой лучше использовать?

2) вырубить подсчет количества товаров в категории (выключен)

1) мало поддерживать, надо еще чтоб сайт поддерживал.

2) в модулях тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

опенкарт Версия 1.5.5.1.2

Подсчет количества товаров я отключал через Настройки

опенкарт или окстор? во втором в этом запросе должно быть изменение под кеширование, правда помоему на минуту

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

опенкарт или окстор? во втором в этом запросе должно быть изменение под кеширование, правда помоему на минуту

остор Версия 1.5.5.1.2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
правда помоему на минуту

 

на час

 

 

Проблема  в модуле меню

 

Ищите исполнителя

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И снова здравствуй Journal :ugeek:

Как сказал chukcha  у авторов journal большая проблема с меню

Ну неужели нельзя было сделать всего одну настройку - "не считать количество товаров в категории" в своем модуле меню

Это же самое известное узкое горлышко opencart

Я не понимаю... они сделали куча настроек каждой "рюшечки", и не сделали важную архитектурную настройку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что характерно:

есть шаблон, платный

у шаблона есть поддержка авторов

 

по какой причине вопросы по шаблону не задаются авторам, а здесь на форуме?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AlexDW  :)

Вы, не знаете как эти "индейцы" посылают пользователей?  Я сам 1000 раз писал в тех. поддержку официально купленных тем... ни ответа, ни привета, на конкретные обоснованные вопросы разработчиков.

Даже указывал как ошибки исправить им же... и в новых версиях, те же грабли

Слабая квалификация авторов тем. Может они хорошие дизайнеры, но видно программную часть передают индусам на аутсорс

 

Поэтому всем рекомендую темы (и модули тоже) с форума. Здесь все разработчики четко реагируют

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я больше про другое

как только поднимается вопрос "а покупалась ли тема", 95% спрашивающих пропадают либо начинают рассказывать про наследство любимого дедушки из Нигерии и тп ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я больше про другое

как только поднимается вопрос "а покупалась ли тема", 95% спрашивающих пропадают либо начинают рассказывать про наследство любимого дедушки из Нигерии и тп ;)

Значит я вхожу в 5% которые ее всетаки купили)

http://rghost.ru/6jPnVFLrD.view

 

Прежде чем задать вопрос разрабам джернала, я хотел понять в чем проблема что-бы им все это обьяснить через переводчик(

 

Вот ответ от Journal

 

Hi, this is not related to the theme, but if you want to turn off the product count look in System > Settings > Edit > Option > Category Product Count.

 

Но и он мне не помог долгий отклик как был так и остался(

Помогите сформулировать вопрос к Mario что-бы он помог мне с моей проблемой.

Изменено пользователем qyyyyyy123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит я вхожу в 5% которые ее всетаки купили)

Уважаем такую культуру

Далее...

Подкатегории видно в списке тормозят (там еще подсчет есть) - это уже не тема

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как думаете может ли помочь мне этот способ?

https://opencartforum.com/topic/1348-tormozit-uzhasno-resheno/

 

Есть ли риск что сайт упадет с концами?

 

На сайте более 1000 подкатегорий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как думаете может ли помочь мне этот способ?

https://opencartforum.com/topic/1348-tormozit-uzhasno-resheno/

 

Есть ли риск что сайт упадет с концами?

 

На сайте более 1000 подкатегорий.

 

Хороших разработчиков на форуме много - советую кого нибудь нанять для устранения проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хороших разработчиков на форуме много - советую кого нибудь нанять для устранения проблемы.

Если за пару дней не смогу самостоятельно решить проблему то так и поступлю.

Только не знаю на какой бюджет расчитывать в решении моей проблемы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за помощь!)

Смог самостоятельно решить проблему!

тему //dell

Изменено пользователем qyyyyyy123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при нахождении решения - неплохо бы его расписать, либо указать ссылку на тему с ним

вам уже без разницы, а гражданам с аналогичной проблемой в будущем это может помочь ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при нахождении решения - неплохо бы его расписать, либо указать ссылку на тему с ним

вам уже без разницы, а гражданам с аналогичной проблемой в будущем это может помочь ;)

Ostore Версия 1.5.5.1.2

Шаблон: Journal 2.5

На сайте 35к товаров и более 1500 категорий и под категорий.

 

Собственно вот что мне помогло:

1. В контроллерах убрал расчет количества товара в категории

catalog/controller/product/category.php

catalog/controller/common/header.php

 $product_total = $this->model_catalog_product->getTotalProducts($data);

изменил на

$product_total = 0;

 

2.включил кэширование модулей journal2

Вот и все!) сайт летает.

Изменено пользователем qyyyyyy123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

извините за тупой вопрос, но этот способ применим для Opencart 2.0.2.0 ?
в фале catalog/controller/product/category.php нашел строчку $product_total
а в файле catalog/controller/common/header.php- нет $product_total
 

Изменено пользователем Michael5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 2.х нет этой проблемы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Собственно вот что мне помогло:...

Спасибо, помогло! Сайт реально залетал)) Посмотрю завтра нагрузку на базу :-) Изменено пользователем afwollis

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.