Оптимизация скорости работы умного фильтра 1С-Битрикс для интернет-магазина с большим каталогом товаров

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

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

Если в вашем каталоге пара тысяч товар, то смысла в этой оптимизации не будет.

Мы проводили тесты на каталоге, в котором 34220 товара и 108051 торговых предложений.
19 свойств в фильтре - это привязки к инфоблокам.

1) Умный фильтр в методе getIBlockItems в цикле получает информацию о каждом свойстве.

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

2) Классу CBitrixCatalogSmartFilter добавляем свойство protected $props_val типа array(), в нём будем запоминать все значения разделов или элементов привязанных инфоблоков

3) Оптимизируем метод fillItemValues.

В этом методе каждый элемент или раздел из привязанного инфоблока запрашивается отдельным запросом.

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

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

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

Итог:

Было - bitrix:catalog.smart.filter: 1.7503 с; Запросов: 5975 (0.7645 с)
Стало - ameton:catalog.smart.filter_optimized: 0.9055 с; Запросов: 467 (0.6222 с)

Мы сократили количество sql-запросов в 12.8 раз! Время генерации фильтра уменьшилось в 2 раза!