«Большие» объемы данных в Битрикс: что убивает производительность
«Битрикс? Да он же не для больших проектов! Тяжёлый, медленный, с устаревшими инфоблоками и неудобной корзиной — всё надо переписывать!» Слышали такое мнение? Да, оно действительно довольно популярно.
1С-Битрикс часто подвергается критике за недостаточную производительность на крупных и высоконагруженных проектах, особенно если речь идёт о масштабных интернет-магазинах. Когда каталог растёт, а нагрузка увеличивается, совет нередко один: «уходить на фреймворк и строить архитектуру заново».
Но на практике всё не так однозначно. Да, у Битрикса есть свои ограничения, но большинство интернет-магазинов с каталогами до 50 000 товаров прекрасно работают на этой платформе. Ключ к стабильности и высокой скорости — грамотная настройка. От правильно подобранного серверного окружения до оптимизации бизнес-логики.
В арсенале самого Битрикса достаточно инструментов для ускорения работы: фасетный индекс, композитный режим, кэширование на уровне компонентов и продуманная структура инфоблоков. Всё это позволяет добиться отличной производительности без радикальных архитектурных изменений.
А что насчёт по-настоящему тяжёлых кейсов? Они тоже бывают. Например, мы в ИНТЕРВОЛГЕ сопровождали проект с каталогом в 2 миллиона SKU и система работала стабильно. Секрет в том же подходе: глубокая оптимизация, продуманное кэширование и аккуратная организация данных внутри инфоблоков.
В этой статье разберем кейс тестирования производительности Битрикс, уделив особое внимание:
-
Выявлению «узких мест»: определим, на каких операциях (списки товаров, фильтрация, детальная) и при каких объемах данных (количество товаров, SKU, свойств) наблюдается значительное снижение производительности.
-
Количественной оценке: предоставим конкретные метрики времени отклика для разных сценариев нагрузки.
-
Инструментам оптимизации: разберём, какие встроенные механизмы Битрикс (кэширование, фасетный индекс, инфоблоки 2.0) и серверные настройки позволяют существенно повысить отзывчивость системы до применения радикальных мер.
Параметры тестирования
Среда тестирования
Платформа: 1С‑Битрикс: Управление сайтом, версия 25.550.100 (редакция «Бизнес»);
Шаблон: стандартный «Интернет-магазин – Одежда» (два инфоблока: каталог товаров и торговые предложения);
Количество разделов каталога: 12.
Тестирование проводилось на сервере со следующими характеристиками:
-
Процессор — 6 ядер по 3,8 ГГц;
-
ОЗУ — 10 Гб;
-
ПЗУ — SSD, 256 Гб.
В тесте были задействованы четыре ключевые страницы:
-
Детальная страница товара;
-
Страница списка товаров с умным фильтром;
-
Страница примененного умного фильтра;
-
Страница поиска.
Какие метрики оценивали:
-
Время генерации страницы;
-
Суммарное количество запросов на странице;
-
Время выполнения запросов.
Также посмотрим, на какой средний RPS можно рассчитывать при разных конфигурациях каталога при идентичных характеристиках сервера.
Нагрузку генерировал Яндекс.Танк в режиме линейного роста: от 10 до 50 RPS в течение 120 секунд (итого 3 600 запросов). Максимальное число инстансов — 20. Для эмуляции пользовательских сценариев использовались страницы каталогов, фильтрации, детальные карточки и страница оформления заказа.
Параметры каталога
|
Номер |
Товаров |
SKU |
Кол-во свойств товаров |
Кол-во свойств SKU |
Типов цен |
Кол-во складов |
Фасетный индекс |
Тип инфоблоков |
Средний RPS |
|
1 |
10 000 |
10 |
20 |
25 |
10 |
10 |
да |
1.0 |
25.94 |
|
2 |
10 000 |
10 |
20 |
25 |
50 |
10 |
да |
1.0 |
21.32 |
|
3 |
10 000 |
10 |
20 |
25 |
10 |
50 |
да |
1.0 |
22.74 |
|
4 |
10 000 |
10 |
20 |
25 |
100 |
50 |
да |
1.0 |
19.25 |
|
5 |
10 000 |
10 |
50 |
50 |
100 |
50 |
да |
1.0 |
18.57 |
|
6 |
50 000 |
10 |
20 |
10 |
1 |
10 |
нет |
1.0 |
20.22 |
|
7 |
50 000 |
10 |
20 |
10 |
1 |
10 |
да |
1.0 |
15.56 |
|
8 |
50 000 |
10 |
20 |
10 |
1 |
10 |
да |
2.0 |
22.46 |
|
9 |
100 000 |
10 |
20 |
15 |
1 |
10 |
да |
2.0 |
14.22 |
Описание полей:
Фасетный индекс — был сгенерирован фасетный индекс или нет;
Тип инфоблоков — какой тип инфоблока каталога и SKU тестировался.
Порядок тестирования
В рамках тестирования проверяли:
-
Какое влияние на производительность оказывает увеличение типов цен, свойств SKU, количество складов (тесты 1–5).
-
Какое влияние на производительность оказывает использование фасетного индекса (тесты 6 и 7).
-
Какое влияние на производительность оказывает использование инфоблоков 2.0 (тесты 6 и 8).
-
На что можно рассчитывать при похожей конфигурации железа и работе с 1 млн SKU (тест 9 в качестве стресс-теста).
Все тесты проводились при выключенном кэшировании. При включенном кэшировании время генерации всех страниц не превышало 0,2 сек.
Результаты тестов
Для начала — сухие цифры с визуализацией.
Количество запросов, которые делает Битрикс
|
Номер параметров |
Количество запросов на детальной |
Количество запросов на странице списка |
Количество запросов с примененным фильтром |
|
1 |
888 |
853 |
539 |
|
2 |
913 |
846 |
531 |
|
3 |
904 |
849 |
537 |
|
4 |
745 |
912 |
663 |
|
5 |
830 |
992 |
743 |
|
6 |
483 |
849 |
537 |
|
7 |
1083 |
830 |
504 |
|
8 |
1078 |
807 |
486 |
|
9 |
871 |
817 |
496 |

Время генерации страниц
|
Номер параметров |
Время генерации детальной страницы, сек. |
Время генерации страницы списка, сек. |
Время генерации страницы с примененным фильтром, сек. |
|
1 |
0,8219 |
0,836 |
0,5571 |
|
2 |
0,8645 |
1,0674 |
0,5794 |
|
3 |
0,8615 |
1,0318 |
0,5793 |
|
4 |
0,8105 |
1,1191 |
0,789 |
|
5 |
0,8453 |
1,7675 |
1,1792 |
|
6 |
0,6437 |
10,4297 |
10,0334 |
|
7 |
1,0272 |
1,3227 |
1,0759 |
|
8 |
0,9494 |
0,9108 |
0,8256 |
|
9 |
0,8053 |
32,7897 |
38,837 |

Время исполнения запросов
|
Номер параметров |
Время исполнения запросов на детальной странице, сек. |
Время исполнения запросов на странице списка, сек. |
Время исполнения запросов на странице с примененным фильтром, сек. |
|
1 |
0,4244 |
0,5351 |
0,3541 |
|
2 |
0,4472 |
0,5705 |
0,3677 |
|
3 |
0,4487 |
0,6046 |
0,3678 |
|
4 |
0,3403 |
0,6948 |
0,5162 |
|
5 |
0,4424 |
1,1077 |
0,825 |
|
6 |
0,4336 |
10,0592 |
9,8315 |
|
7 |
0,5293 |
0,7671 |
0,6776 |
|
8 |
0,5065 |
0,5812 |
0,6752 |
|
9 |
0,4051 |
32,4376 |
38,6649 |

Интерпретация результатов
Ключевые наблюдения по результатам тестов:
-
Увеличение числа ценовых типов (тест №1 vs №2) приводит к незначительному возрастанию общего числа SQL‑запросов и умеренному росту времени их выполнения на всех проверяемых страницах.
-
Увеличение числа складов (сравнение результатов №2 и №3) не влияет на количество запросов и время их исполнения для всех страниц.
-
Рост количества свойств SKU (сравнение результатов №4 и №5) незначительно повышает количество запросов. При этом значительно увеличивается время их исполнения, но только для страниц списка товаров и страниц с примененным фильтром.
В чем причина роста долгих запросов при увеличении количества свойств SKU? Если посмотреть на запросы, которые выполняются на странице списка товаров, один из самых долгих делает компонент “Битрикс:catalog.smart.filter”. Это запрос для построения динамических фильтров (фасетов) на странице каталога.
Фасетный индекс
В 1С‑Битрикс фасетный индекс (Property Index) оптимизирует «умный фильтр» и вызовы CIBlockElement::GetList с фильтрацией по свойствам. Он хранит для каждого раздела и каждого элемента информацию о доступных значениях свойств и типов цен.
Таблица фасетного индекса содержит следующие поля:
-
ID раздела;
-
ID элемента;
-
FACET_ID — id, которое генерируется на основе того, для чего это значение — свойство или тип цены;
-
Значение — хранимое значение.
Использование фасетного индекса при вызове CIBlockElement:GetList включается только, если выполнены все следующие условия:
-
Происходит фильтрация свойств;
-
Используется логический оператор AND;
-
В фильтре есть IBLOCK_ID;
-
В фильтре есть фильтрация по разделам SECTION_ID;
-
В фильтре установлена фильтрация по активности ACTIVE=”Y”.
Ускорение — это хорошо. Но почему при добавлении небольшого количества свойств мы видим сильную деградацию в скорости выполнения запросов?
Основная проблема кроется в размере таблицы фасетного индекса. Во время теста №4 её объём составлял около 11 миллионов записей, а после добавления новых свойств увеличился до 18 миллионов.
При работе фасетного индекса система выполняет JOIN таблицы элементов с таблицей фасетов, и чем больше становится последняя, тем сильнее это влияет на производительность запросов.
Вывод: если в проекте много разделов, свойств, типов цен или SKU, размер таблицы фасетного индекса быстро растёт, и в определённый момент MySQL перестаёт эффективно обрабатывать такие JOIN-запросы.
На тестовом стенде деградация производительности наблюдалась уже при объёме таблицы фасетов более 10 миллионов записей.
Чтобы оценить примерный размер таблицы фасетного индекса, можно воспользоваться формулой:
Количество записей в таблице фасетов = количество разделов × (количество товаров × количество свойств товаров) + (количество SKU × (количество свойств SKU + количество типов цен))
Для понимания масштаба:
-
генерация фасетного индекса для 50 000 товаров с 10 SKU заняла около 50 минут,
-
а для 100 000 товаров с тем же количеством SKU — примерно 1,5 часа.
Большое количество свойств
Проблема большого количества записей, которая была выявлена при тестировании с фасетным индексом, на самом деле распространяется и на некоторые другие таблицы, например:
-
При увеличении типов цен будет расти не только таблица фасетов, но и таблица b_catalog_price, которая хранит цены к каждому sku.
-
При увеличении количества складов будет расти таблица b_catalog_store_product, которая хранит остатки по складам.
-
При увеличении количества свойств у sku будет расти таблица b_iblock_element_property, в которой хранятся значения свойств для всех инфоблоков (если это не инфоблоки 2.0).
Проблему с b_catalog_price и b_catalog_store_product можно заметить только при работе с корзиной или на странице оформления заказов. А вот проблема большого количества свойств будет сопровождать на всем конверсионном пути.
Битрикс «из коробки» предлагает решение для хранения большого количества свойств — Инфоблоки 2.0. При переводе инфоблоков в режим 2.0 под каждый инфоблок создается отдельная таблица, и свойства хранятся не как отдельные записи, а как столбцы в новой созданной таблице. Из-за этого количество обрабатываемых строк становится в разы меньше.
В наших тестах (№7 и №8) видно незначительное ускорение за счет перехода на инфоблоки 2.0. При переводе инфоблока sku на Инфоблоки 2.0 мы обнаружили резкое падение производительности: время генерации детальных и списковых страниц возросло с ~4 сек. до более чем 10 сек. Причиной оказалось отсутствие индекса mysql на столбец со свойством, в котором указана привязка sku к родительскому товару.
После создания индекса командой
CREATE INDEX idx_prop19_elem
ON b_iblock_element_prop_s3 (PROPERTY_19,IBLOCK_ELEMENT_ID);
время генерации страниц значительно уменьшилось (результат теста 8).
Поиск
В 1С-Битрикс реализован собственный поисковый механизм с морфологическим анализом (стеммингом): ключевые слова разбиваются на основы, которые сохраняются в таблицах b_search_content_stem и b_search_stem. В рамках исследования оценивалось исключительно время выполнения поисковых операций, без учёта качества поиска и алгоритмов ранжирования.
Результаты тестирования при индексации 50 000 товаров:
-
Первый запрос (без кэша): 600–1000 SQL-запросов, время отклика около 8 секунд.
-
Повторный запрос (без кэша): 300–400 запросов, время отклика 1–2 секунды.
-
Кэшированная страница: 200–300 запросов, время отклика менее 1 секунды.
Задержка при первом обращении объясняется большим количеством JOIN-операций между крупными таблицами стемминга. Например, таблица b_search_content_stem содержала порядка 29 миллионов записей. Последующие запросы выполняются значительно быстрее за счёт кэширования промежуточных результатов.
Заключение и рекомендации
Важно учитывать, что тестирование проводилось на чистом стенде — без кэшей, оптимизаций и доработок. Такой подход позволяет объективно сравнивать разные конфигурации, но требует осторожности при интерпретации полученных данных. В реальных условиях производительность зависит от архитектуры проекта, качества реализации и конкретных параметров сервера.
Во время тестов сравнивались различные варианты конфигураций каталога, чтобы определить влияние ключевых факторов на скорость работы системы:
-
количество типов цен и складов;
-
число свойств SKU;
-
использование фасетного индекса;
-
переход на инфоблоки 2.0.
Ключевые выводы
-
Типы цен: каждый новый тип добавляет нагрузку на таблицу b_catalog_price и фасетный индекс, увеличивая время генерации страниц на 5–10%.
-
Склады: рост их количества до 50 почти не влияет на страницы каталога, но замедляет корзину и процесс оформления заказа.
-
Свойства SKU: увеличение их числа значительно увеличивает объём фасетного индекса и таблицы b_iblock_element_property, что может привести к почти двукратному росту времени выполнения запросов.
-
Фасетный индекс: эффективно ускоряет фильтрацию при умеренном количестве свойств, но при превышении 10 млн записей в таблице наблюдается деградация из-за тяжёлых JOIN-операций.
-
Инфоблоки 2.0: снижают нагрузку за счёт уменьшения количества строк в таблицах, частично компенсируя минусы фасетного индекса, однако требуют грамотной индексации MySQL-колонок после миграции.
Что можно улучшить без серьёзных доработок компонентов
-
Оптимизация фильтрации и свойств. Проведите аудит бизнес-требований: действительно ли все свойства должны участвовать в фильтре? Их избыток напрямую увеличивает объём фасетного индекса.
-
Типы цен. Не рекомендуется использовать более 10–20 типов — дальше лучше перейти на кастомные механизмы скидок или индивидуальные расчёты.
-
Склады. Минимизируйте их количество ещё на этапе проектирования, чтобы избежать сложных оптимизаций позже.
-
Инфоблоки 2.0. Применяйте при каталогах от 50 000 товаров и выше, обязательно индексируя ключевые поля (например, PROPERTY_CML2_LINK). Помните, что в новой модели каждое свойство превращается в отдельный столбец, а MySQL ограничен по их числу — перевод возможен при менее чем 50 свойствах.
-
Поиск. Индексируйте только действительно нужные поля и свойства. Избыточная индексация превращает таблицы b_search_content и стемминга в «тормозящие» узкие места.
А если у вас реально большой каталог?
Представим, что у вас:
-
1 млн товаров;
-
сотни или тысячи свойств;
-
десятки типов цен;
-
много складов;
при этом базовая оптимизация уже выполнена: железо обновили, MySQL «подкрутили», лицензия Enterprise куплена, но всё равно всё тормозит.
В этом случае стандартные компоненты Битрикс становятся узким горлышком. Они универсальны, но генерируют много SQL-запросов и плохо масштабируются на очень больших объемах.
Что делали мы в таких ситуациях:
-
Вынос свойств в отдельные таблицы. В одном из проектов (например, marketplace для ЕВРАЗ) каталог содержал тысячи свойств, но реально использовалось лишь несколько сотен. Мы вынесли свойства в отдельные Highload-блоки и перешли на инфоблоки 2.0. Это позволило уменьшить фасетный индекс и повысить производительность фильтрации.
-
Внешние поисковые движки. Перенос фильтрации и поиска в специализированные системы вроде ElasticSearch, OpenSearch или Meilisearch. Да, это требует полной переработки компонентов фильтра, поиска и страницы раздела, но отдача — колоссальная. Вынос тяжелых операций в отдельное приложение разгружает основной сайт и ускоряет отклик в разы.
-
Отдельный кэш для детальных страниц. У Битрикс есть технология тегированного кэша. Она заключается в том, что при обновлении любого элемента инфоблока сбрасывается кэш всех компонентов, которые настроены на данный инфоблок. Из-за этого возникает ситуация, когда вы изменяете один товар в инфоблоке, а кэш детальных страниц сбрасывается у всех остальных товаров. Чтобы решить эту проблему, мы реализовывали кастомный кэш детальных страниц, который сбрасывался только в случае реального обновления элемента.
Битрикс может работать стабильно даже на больших объемах при условии грамотной архитектуры, оптимизации и кастомизации. Стандартных решений будет недостаточно, если проект растет, а требования становятся ближе к enterprise‑уровню.
Мы в ИНТЕРВОЛГЕ любим и умеем работать с такими задачами — приходите, если нужно превратить «тормозной битрикс» в масштабируемый и быстрый интернет-магазин, маркетплейс или другой проект. Заполните форму на нашем сайте, и мы свяжемся с вами для уточнения задачи.
Автор: egor-iv

