Умный фильтр на большом каталоге работает медленно по вполне понятной причине: свойства товаров хранятся в отдельных таблицах, и чтобы отобрать позиции по трём характеристикам сразу, базе приходится соединять их между собой. На десятках тысяч товаров это занимает секунды.
Фасетный индекс решает задачу иначе: значения свойств заранее раскладываются в одну плоскую таблицу, оптимизированную под выборку. Разберём, как его включить, сколько это даёт и какие ограничения приходят вместе с ускорением.
Как работает без индекса
Значения свойств элементов хранятся в служебных таблицах: одна строка — одно значение одного свойства одного элемента. Фильтр по трём свойствам превращается в соединение таблицы свойств с самой собой несколько раз.
Практические следствия:
- время отклика растёт с числом выбранных фильтров;
- подсчёт количества товаров в каждом варианте фильтра — отдельная нагрузка;
- на пиковой посещаемости база упирается в лимит соединений.
Последнее хорошо заметно по симптомам, разобранным в статье Too many connections в MySQL на Битрикс: сайт падает именно в часы наибольшей нагрузки.
Что делает фасетный индекс
Битрикс создаёт отдельную таблицу, где для каждого элемента заранее записаны все значения его свойств в удобном для выборки виде. Фильтр обращается к одной таблице вместо множества соединений.
| Без индекса | С индексом | |
|---|---|---|
| Число соединений таблиц | По одному на свойство | Одна таблица |
| Скорость на большом каталоге | Секунды | Десятки миллисекунд |
| Подсчёт количества в фильтре | Тяжёлый | Быстрый |
| Нагрузка на базу | Высокая | Низкая |
| Требует пересчёта | Нет | Да, при изменении данных |
Выигрыш тем заметнее, чем больше каталог и чем больше свойств участвует в фильтре. На тысяче товаров разница может быть незаметной, на пятидесяти тысячах — принципиальной.
Нужна помощь с Битрикс?
Включение
Индекс включается на уровне инфоблока:
- Откройте настройки инфоблока каталога.
- Перейдите на вкладку с настройками фасетного индекса.
- Включите использование индекса.
- Запустите построение.
- Дождитесь завершения — на большом каталоге это долго.
Построение — тяжёлая операция: система обходит все элементы и раскладывает их свойства. Запускать её на боевом сайте в рабочее время не стоит.
Какие свойства попадают в индекс
Индексируются только те свойства, которые помечены как участвующие в умном фильтре. Это настраивается в свойствах инфоблока.
Практическое правило: включайте в фильтр только то, чем реально пользуются. Каждое лишнее свойство увеличивает объём индекса и время пересчёта, а фильтр из двадцати параметров всё равно никто не использует целиком.
Пересчёт индекса
Главное ограничение: индекс нужно поддерживать в актуальном состоянии. Изменился товар — изменилась и его строка в индексе.
Битрикс пересчитывает индекс автоматически при изменении элемента, но есть нюансы:
- Массовые операции пересчитывают индекс массово. Импорт десяти тысяч товаров запускает пересчёт для каждого — обмен растягивается.
- Прямые изменения в базе индекс не обновляют. Если данные меняются в обход API, индекс останется старым.
- Добавление нового свойства в фильтр требует полной перестройки.
Обмен с 1С и индекс
Самая частая практическая проблема. Обмен обновляет тысячи товаров, и каждый вызывает пересчёт. Стандартное решение — отключать пересчёт на время обмена, а после его завершения перестраивать индекс целиком одним проходом. О самом обмене есть статья Интеграция Битрикс с 1С.
Когда индекс не нужен
| Ситуация | Нужен ли индекс |
|---|---|
| Каталог до тысячи товаров | Скорее нет |
| Фильтр по одному-двум свойствам | Скорее нет |
| Десятки тысяч товаров | Да |
| Фильтр по пяти и более свойствам | Да |
| Товары обновляются каждые несколько минут | Осторожно: пересчёт съест выигрыш |
| Каталог почти не меняется | Да, идеальный случай |
Идеальные условия для фасетного индекса — большой каталог, который обновляется раз в сутки. Худшие — небольшой каталог с постоянно меняющимися остатками: пересчёт будет идти чаще, чем выборки.
Проверка эффекта
- Замерьте время отклика страницы фильтра до включения.
- Включите индекс и постройте его.
- Замерьте снова на той же комбинации фильтров.
- Проверьте несколько разных комбинаций, а не одну.
- Убедитесь, что счётчики количества товаров показывают верные значения.
- Измените товар и проверьте, что фильтр его учитывает.
Шестой пункт важнее остальных: если индекс не пересчитывается, фильтр начнёт показывать товары, которых уже нет, или скрывать существующие. Ошибка неочевидная — сайт работает, но выдаёт неверные данные.
Частые проблемы
- Индекс включён, но не построен. Фильтр не находит ничего или работает как раньше.
- Индекс устарел. В фильтре есть товары, которых нет в каталоге, и наоборот. Решается перестроением.
- Обмен стал идти в разы дольше. Пересчёт на каждом элементе — нужно отключать на время обмена.
- Свойство добавили в фильтр, оно не работает. Индекс нужно перестроить.
- Место на диске кончилось. На очень больших каталогах таблица индекса заметно велика.
- Индекс включили, скорость не выросла. Узкое место было не в фильтре — проверьте кеширование и монитор производительности.
Итог
Фасетный индекс раскладывает значения свойств товаров в одну плоскую таблицу и убирает тяжёлые соединения при работе умного фильтра. На каталогах в десятки тысяч позиций это разница между секундами и десятками миллисекунд.
Цена — необходимость поддерживать индекс в актуальном состоянии. Основное, что нужно предусмотреть заранее: отключение пересчёта на время обмена с 1С и полное перестроение после него. И включать в фильтр стоит только те свойства, которыми покупатели реально пользуются.
