Оптимизация каталога товаров «Сонотеки»

Задача:

Оптимизировать работу каталога.

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

Возникающие проблемы (даже при правильно настроенной работе кеширования):

  • первая загрузка занимает много времени
  • память сервера перегружается при одновременном использовании «тяжелых» страниц несколькими пользователями без сохраненного кэша
  • полная неработоспособность сервиса из-за перегруженной оперативной памяти
Решение:

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

Поиск «узких» мест
Выявлен ряд запросов, необоснованно увеличивающих нагрузку

При установленных в фильтре параметрах, раздел «Кровати» загружается восемь минут. Оперативная память сервера постепенно переполняется, и в момент появления очередного запроса к базе данных, сервис mysql завершает работу с ошибкой. Ситуация осложняется отсутствием возможности создать swap-файл на хостинге.

Причиной долговременного выполнения запроса является подзапрос на получение идентификаторов родительских товаров торговых предложений по заданной фильтрации.

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

Решение — отделить подзапрос от родительского, сделать самостоятельным и передать результат выполнения основному запросу в фильтр.

Оптимизация списка товаров
Снизилось количество запросов и время формирования страницы

При установленных в фильтре параметрах, раздел «Кровати» загружается восемь минут. Оперативная память сервера постепенно переполняется, и в момент появления очередного запроса к базе данных, сервис mysql завершает работу с ошибкой. Ситуация осложняется отсутствием возможности создать swap-файл на хостинге.

Причиной долговременного выполнения запроса является подзапрос на получение идентификаторов родительских товаров торговых предложений по заданной фильтрации.

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

Решение — отделить подзапрос от родительского, сделать самостоятельным и передать результат выполнения основному запросу в фильтр.

Оптимизация списка товаров
Снизилось количество запросов и время формирования страницы

При установленных в фильтре параметрах, раздел «Кровати» загружается восемь минут. Оперативная память сервера постепенно переполняется, и в момент появления очередного запроса к базе данных, сервис mysql завершает работу с ошибкой. Ситуация осложняется отсутствием возможности создать swap-файл на хостинге.

Причиной долговременного выполнения запроса является подзапрос на получение идентификаторов родительских товаров торговых предложений по заданной фильтрации.

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

Решение — отделить подзапрос от родительского, сделать самостоятельным и передать результат выполнения основному запросу в фильтр.

Поиск «узких» мест
Выявлен ряд запросов, необоснованно увеличивающих нагрузку

При установленных в фильтре параметрах, раздел «Кровати» загружается восемь минут. Оперативная память сервера постепенно переполняется, и в момент появления очередного запроса к базе данных, сервис mysql завершает работу с ошибкой. Ситуация осложняется отсутствием возможности создать swap-файл на хостинге.

Причиной долговременного выполнения запроса является подзапрос на получение идентификаторов родительских товаров торговых предложений по заданной фильтрации.

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

Решение — отделить подзапрос от родительского, сделать самостоятельным и передать результат выполнения основному запросу в фильтр.

Решение:

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

На данном сайте собираются метаданные пользователя (cookie, данные об IP-адресе и местоположении) для функционирования сайта. Если Вы не хотите чтобы эти данные обрабатывались, то должны покинуть сайт

Заявка
на сотрудничество

Как вас зовут? Заполните это поле
Адрес электронной почты Неверный формат почты
Телефон для связи Заполните это поле
Нажимая на кнопку «Отправить заявку»,
я даю согласие на обработку персональных данных