Как мы используем Smart.filter

Одним из самых анонсированных нововведений 12 версии 1С-Битрикс является компонент «умного фильтра». Указываем в админке свойства, вставляем в каталог, и у нас появляется фильтр, который отображает только необходимые свойства, отображает найденное количество элементов, и при этом неплохо смотрится.

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

Стандартный компонент фильтра интернет-магазина обоев. Время выполнения страницы каталога 5.7978 сек:
001
Из них 4.9329 сек время выполнения компонента фильтра:
002

Практически все время ушло на построение фильтра, при этом 70% — на работу PHP-логики. Дело в том, что фильтр получает запросом все товары со всеми свойствами для текущего раздела, после чего поля для фильтра строятся на основе этого массива.

Немного оптимизируем компонент для улучшения производительности. Получим следующие данные (на примере слева оригинальный компонент, справа доработанный):

filter1filter2

Разница в два с половиной порядка.  Мы заменили с 52 по 135 строчки кода компонента, где идет обращение через Bitrix API к БД.

Всего 3 вида запросов:

  1. Условие IF/ELSE если свойство множественное
  2. Получение цен или другого RANGE для свойства

Общее построение запроса:
SELECT
          VALUE
FROM
          b_iblock_element_prop_m* INNER JOIN (SELECT Elements) ON ELEMENT_ID
WHERE
          PROPERTY_ID = искомое ID
GROUP BY
          VALUE

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

В полной мере данное решение было протестировано на высоконагруженном проекте OZONRU.KZ с количеством активных товаров в каталоге около 400 000 позиций. Об этом мы рассказывали на конференции CMS Magazine.

Координационный
совет SPECIA
Санкт-Петербург,
8-я Красноармейская ул., д.10