Главная » Администрирование Битрикс » Инфоблоки » Фасетный индекс в Битрикс: ускорение умного фильтра

Фасетный индекс в Битрикс: ускорение умного фильтра

Схема фасетного индекса в Битрикс: значения свойств собраны в одну таблицу вместо соединения нескольких

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

Фасетный индекс решает задачу иначе: значения свойств заранее раскладываются в одну плоскую таблицу, оптимизированную под выборку. Разберём, как его включить, сколько это даёт и какие ограничения приходят вместе с ускорением.

Как работает без индекса

Значения свойств элементов хранятся в служебных таблицах: одна строка — одно значение одного свойства одного элемента. Фильтр по трём свойствам превращается в соединение таблицы свойств с самой собой несколько раз.

Практические следствия:

  • время отклика растёт с числом выбранных фильтров;
  • подсчёт количества товаров в каждом варианте фильтра — отдельная нагрузка;
  • на пиковой посещаемости база упирается в лимит соединений.

Последнее хорошо заметно по симптомам, разобранным в статье Too many connections в MySQL на Битрикс: сайт падает именно в часы наибольшей нагрузки.

Что делает фасетный индекс

Битрикс создаёт отдельную таблицу, где для каждого элемента заранее записаны все значения его свойств в удобном для выборки виде. Фильтр обращается к одной таблице вместо множества соединений.

Без индекса С индексом
Число соединений таблицПо одному на свойствоОдна таблица
Скорость на большом каталогеСекундыДесятки миллисекунд
Подсчёт количества в фильтреТяжёлыйБыстрый
Нагрузка на базуВысокаяНизкая
Требует пересчётаНетДа, при изменении данных

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

Нужна помощь с Битрикс?





    Включение

    Индекс включается на уровне инфоблока:

    1. Откройте настройки инфоблока каталога.
    2. Перейдите на вкладку с настройками фасетного индекса.
    3. Включите использование индекса.
    4. Запустите построение.
    5. Дождитесь завершения — на большом каталоге это долго.

    Построение — тяжёлая операция: система обходит все элементы и раскладывает их свойства. Запускать её на боевом сайте в рабочее время не стоит.

    Какие свойства попадают в индекс

    Индексируются только те свойства, которые помечены как участвующие в умном фильтре. Это настраивается в свойствах инфоблока.

    Практическое правило: включайте в фильтр только то, чем реально пользуются. Каждое лишнее свойство увеличивает объём индекса и время пересчёта, а фильтр из двадцати параметров всё равно никто не использует целиком.

    Пересчёт индекса

    Главное ограничение: индекс нужно поддерживать в актуальном состоянии. Изменился товар — изменилась и его строка в индексе.

    Битрикс пересчитывает индекс автоматически при изменении элемента, но есть нюансы:

    • Массовые операции пересчитывают индекс массово. Импорт десяти тысяч товаров запускает пересчёт для каждого — обмен растягивается.
    • Прямые изменения в базе индекс не обновляют. Если данные меняются в обход API, индекс останется старым.
    • Добавление нового свойства в фильтр требует полной перестройки.

    Обмен с 1С и индекс

    Самая частая практическая проблема. Обмен обновляет тысячи товаров, и каждый вызывает пересчёт. Стандартное решение — отключать пересчёт на время обмена, а после его завершения перестраивать индекс целиком одним проходом. О самом обмене есть статья Интеграция Битрикс с 1С.

    Когда индекс не нужен

    СитуацияНужен ли индекс
    Каталог до тысячи товаровСкорее нет
    Фильтр по одному-двум свойствамСкорее нет
    Десятки тысяч товаровДа
    Фильтр по пяти и более свойствамДа
    Товары обновляются каждые несколько минутОсторожно: пересчёт съест выигрыш
    Каталог почти не меняетсяДа, идеальный случай

    Идеальные условия для фасетного индекса — большой каталог, который обновляется раз в сутки. Худшие — небольшой каталог с постоянно меняющимися остатками: пересчёт будет идти чаще, чем выборки.

    Проверка эффекта

    1. Замерьте время отклика страницы фильтра до включения.
    2. Включите индекс и постройте его.
    3. Замерьте снова на той же комбинации фильтров.
    4. Проверьте несколько разных комбинаций, а не одну.
    5. Убедитесь, что счётчики количества товаров показывают верные значения.
    6. Измените товар и проверьте, что фильтр его учитывает.

    Шестой пункт важнее остальных: если индекс не пересчитывается, фильтр начнёт показывать товары, которых уже нет, или скрывать существующие. Ошибка неочевидная — сайт работает, но выдаёт неверные данные.

    Частые проблемы

    • Индекс включён, но не построен. Фильтр не находит ничего или работает как раньше.
    • Индекс устарел. В фильтре есть товары, которых нет в каталоге, и наоборот. Решается перестроением.
    • Обмен стал идти в разы дольше. Пересчёт на каждом элементе — нужно отключать на время обмена.
    • Свойство добавили в фильтр, оно не работает. Индекс нужно перестроить.
    • Место на диске кончилось. На очень больших каталогах таблица индекса заметно велика.
    • Индекс включили, скорость не выросла. Узкое место было не в фильтре — проверьте кеширование и монитор производительности.

    Итог

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

    Цена — необходимость поддерживать индекс в актуальном состоянии. Основное, что нужно предусмотреть заранее: отключение пересчёта на время обмена с 1С и полное перестроение после него. И включать в фильтр стоит только те свойства, которыми покупатели реально пользуются.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    База знаний