Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Счётчик товаров в категории


Prooksius

Recommended Posts

Как-то пришлось работать с магазином, в котором было много товаров, до 50к. И заказчик очень захотел, чтобы показывались количества товаров в разных категориях. В модуле category они обычно выводятся в скобочках. И есть возможность отключать это в Системе настройкой "Счётчик товаров в категории". Там еще предупреждение выводится, что если много товаров - будет тормозить.

Проанализировал запрос, который делается при подсчете количества товаров в папке, phpMyAdmin (анализ запроса). Выяснилось, что он очень нерационально выполняется. Явно было недостаточно какого-то индекса. И точно, в таблице oc_category_path нехватало простого индекса по полю path_id. Там есть Primary по двум полям, но нужно было именно по path_id.
Добавьте, у кого много товаров и тормозит. Мне помогло существенно.

Змінено користувачем Prooksius
  • +1 1
Надіслати
Поділитися на інших сайтах

а не проще ночью по крону считать и складывать в какое-то поле в таблице category чтоб сервер не колбасить?

 

Надіслати
Поділитися на інших сайтах

я еще прикрутил кэш к этому делу.
То есть, если считается для какой-то категории (только для нее, без учета всяких фильтров) тогда смотрим в кэш для этой категории, если есть - то не обращаемся к БД и берем из кэша. Если сохраненного в кэше по этой категории нет - делаем стандартный запрос к БД и сохраняем в кэш для этой категории.

Я говорю о станартном кэше опенкарта:
$this->cache->get
$this->cache->set

Но вот если надо почитать количество с учетом каких-то проставленных фильтров - вариантов может быть очень много, все не сохранишь, будь то в кэше, будь то в каком-то поле...

Надіслати
Поділитися на інших сайтах

Только что, spectre сказал:

а не проще ночью по крону считать и складывать в какое-то поле в таблице category чтоб сервер не колбасить?

 

проще, если частое обновление - то и чаще

 

И.. Это если включен
'filter_sub_category' => true

Надіслати
Поділитися на інших сайтах

1 минуту назад, Prooksius сказал:

Если сохраненного в кэше по этой категории нет - делаем стандартный запрос к БД и сохраняем в кэш для этой категории.

Тут все зависит от частоты посещения категории

Если категорий мало, а посещений много - то, возможно кеш и поможет.
А если категорий много , и есть мало посещаемые, то такой кеш до одного места..

Надіслати
Поділитися на інших сайтах

Но в том, то и дело, что этот доп. индекс у меня решил все проблемы со скоростью. Собствено уже и кэш не нужен, все быстро открывается

  • +1 1
Надіслати
Поділитися на інших сайтах

1 минуту назад, Prooksius сказал:

Но в том, то и дело, что этот доп. индекс у меня решил все проблемы со скоростью. Собствено уже и кэш не нужен, все быстро открывается

 

Prooksius не подскажите с примером как поставить такой индекс)

Надіслати
Поділитися на інших сайтах


3 минуты назад, almir сказал:

 

Prooksius не подскажите с примером как поставить такой индекс)

https://www.awesomescreenshot.com/video/1860545?key=55b877a3edb55b1294bf1562932d0a0a

  • +1 1
Надіслати
Поділитися на інших сайтах

А также сделал explain - рекомендую и вам

 

https://prnt.sc/vqhcd4

 

Но

 

https://prnt.sc/vqhd5x

 

И еще одно но

сравните с первым скрином

https://prnt.sc/vqhg7x

 

 

т.е.. ваш случай частичный

Надіслати
Поділитися на інших сайтах

Только что, Prooksius сказал:

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

И заметьте все запросы делались с наличием индекса по path_id

Надіслати
Поділитися на інших сайтах

5 minutes ago, Prooksius said:

аа, вот оно что, в каких-то случаях он все-таки не используется.. Ясно.

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

 

индекс по path_id - мастхэв для мелких категорий, все верно 👍

Змінено користувачем 100napb
  • +1 1
Надіслати
Поділитися на інших сайтах

так же для Оптимизации подсчета Количества товара в запросе не нужна таблица `product_description` и соответственно условие по Языку - `language_id`

и если вместо NOW() можно использовать функцию из php date("Y-m-d") , то запрос сам собой будет кешироваться.

но это код Опенкарта надо менять.

Надіслати
Поділитися на інших сайтах

1 минуту назад, vier сказал:

Количества товара в запросе не нужна таблица `product_description` и соответственно условие по Языку - `language_id`

Не поверите... нужна!!!

Существуют такие ситуации, что в базе нет соответствующих языковых сущностей

  • +1 1
Надіслати
Поділитися на інших сайтах

3 минуты назад, chukcha сказал:

Существуют такие ситуации, что в базе нет соответствующих языковых сущностей

ааа, я понял - это тот случай...

Надіслати
Поділитися на інших сайтах

20 минут назад, chukcha сказал:

Не поверите... нужна!!!

Существуют такие ситуации, что в базе нет соответствующих языковых сущностей

Блин, не учел этот момент, Действительно такое бывает, но это, по-моему, скорее ошибка, нежели нормальная работа магазина.
А я действительно, как vier и сказал, убрал эту таблицу, если это не поиск по названию, например, а просто подсчет кол-ва товаров, например, в категории.

Надіслати
Поділитися на інших сайтах

4 минуты назад, Prooksius сказал:

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

Это фича

Конечно, это очень маленький процент

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

  • +1 1
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.