БесплатноБесплатный аудит сайта и кода на 1С-Битрикс при заказе доработки или поддержки

Оптимизация запросов и индексов в 1С-Битрикс

Оптимизация SQL-запросов и индексов базы данных в 1С-Битрикс: slow log, EXPLAIN, свойства инфоблоков и D7

Пока в каталоге пара тысяч товаров, всё летает. Но на десятках и сотнях тысяч позиций, под оптовой нагрузкой и активным обменом с 1С, сайт вдруг начинает «тормозить без причины»: каталог грузится секундами, фильтр думает, сервер под пиковой загрузкой. В подавляющем большинстве случаев причина одна — база данных и неоптимизированные запросы.

Эта статья — практический разбор, как оптимизировать SQL-запросы и индексы в 1С-Битрикс: как найти медленные запросы через slow log и EXPLAIN, где нужны индексы, что делать со свойствами инфоблоков и умным фильтром, как писать эффективные выборки на D7 и подкреплять всё кэшем. Если сайт уже ощутимо тормозит, начните с аудита и оптимизации решения на 1С-Битрикс.

Коротко

  • На больших каталогах узкое место — база: тяжёлые запросы и выборки по неиндексированным полям.
  • Диагностика начинается со slow query log и EXPLAIN — не гадайте, измеряйте реальные запросы.
  • Индексируйте под реальные запросы, переводите свойства инфоблоков в отдельные таблицы, включайте фасетный индекс.
  • Пишите точные выборки на D7 (select/filter/limit) и подкрепляйте оптимизацию кэшем — они дополняют друг друга.

Почему база становится узким местом

Каждая страница каталога, каждое срабатывание умного фильтра и поиска превращаются в SQL-запросы к базе. Пока данных мало, даже неоптимальный запрос отрабатывает быстро — база успевает перебрать небольшие таблицы. Но с ростом каталога стоимость плохого запроса растёт нелинейно: перебор миллионов строк вместо доступа по индексу превращает миллисекунды в секунды.

Добавьте оптовую нагрузку (много одновременных пользователей) и активный обмен с 1С (постоянные вставки и обновления), и база становится главным узким местом. При этом код и кэш могут быть в порядке — упор именно в СУБД. Поэтому на крупных проектах оптимизация начинается не с «переписать компонент», а с анализа того, что и как спрашивают у базы.

Диагностика: slow query log

Оптимизация вслепую — пустая трата времени. Первый шаг всегда один: включить журнал медленных запросов (slow query log) и получить факты. В него попадают запросы, выполняющиеся дольше заданного порога, — это и есть ваши реальные проблемные места, а не догадки.

  1. Включите slow log. Задайте разумный порог (например, доли секунды) и включите журнал в настройках MySQL/MariaDB.
  2. Соберите данные под нагрузкой. Дайте журналу поработать в реальном или тестовом трафике, чтобы поймать типовые запросы.
  3. Сгруппируйте запросы. Найдите самые частые и самые тяжёлые — начинать нужно с них, а не со случайных.
  4. Зафиксируйте базовые метрики. Время выполнения и частота — чтобы потом измерить эффект оптимизации.

Именно slow log превращает субъективное «сайт тормозит» в конкретный список запросов, которые дают наибольший вклад в медленность. С него начинается любая осмысленная оптимизация базы.

Обмен данными сайта с 1С Сайткаталог, заказы1Стовары, заказыОбменочередь / APIДанные идут в обе стороны по расписанию или по событию
Схема: сайт и 1С обмениваются данными в обе стороны — по расписанию или по событию. Товары и остатки приходят на сайт, заказы уходят обратно.

Разбор запроса через EXPLAIN

Найдя тяжёлый запрос, его анализируют через EXPLAIN — команду, показывающую план выполнения. Она отвечает на главные вопросы: используются ли индексы, сколько строк перебирается, в каком порядке читаются таблицы.

Поле EXPLAINЧто означаетСигнал проблемы
typeТип доступа к таблицеALL — полное сканирование
keyИспользуемый индексNULL — индекс не задействован
rowsОценка перебираемых строкБольшое число
ExtraДоп. операцииUsing filesort, Using temporary

Цель оптимизации — заменить полное сканирование таблицы (type=ALL) доступом по индексу и сократить число перебираемых строк. Если EXPLAIN показывает ALL и большой rows на поле, по которому идёт фильтрация, — это прямой кандидат на индекс. Так «медленно» превращается в понятную, устранимую причину.

Индексы: когда помогают, когда вредят

Индекс — структура, позволяющая базе находить строки без перебора всей таблицы. Он резко ускоряет чтение, но у него есть цена: замедление вставки и обновления (индекс надо поддерживать) и дополнительное место на диске. Поэтому индексы добавляют осознанно, под конкретные запросы, а не на все поля «про запас».

Ключевой принцип: индексы должны идти от реальных запросов из slow log, а не от интуиции. Избыточная индексация вредит записи так же, как недостаточная — чтению.

Свойства инфоблоков и хранение

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

Решение штатное: для крупных инфоблоков включают режим хранения свойств в отдельной таблице (конвертация в настройках инфоблока). Тогда каждое свойство становится колонкой в нормальной таблице, которую можно индексировать, а выборки и фильтрация по свойствам ускоряются в разы. Это одна из первых оптимизаций, которую делают на крупных каталогах, и она часто даёт самый заметный эффект. Как эффективно обращаться к данным через современный API — в статье про D7 и ORM.

Умный фильтр и фасетный индекс

Умный фильтр (catalog.smart.filter) — один из самых нагруженных элементов каталога: на каждый набор условий он должен посчитать доступные значения и количество товаров. Без оптимизации это тяжёлые запросы по свойствам.

В 1С-Битрикс для этого есть фасетный индекс — специальная структура, которая заранее хранит агрегированные данные для фильтрации. С включённым фасетным индексом умный фильтр работает по подготовленным данным, а не пересчитывает всё на лету, и отвечает быстро даже на большом каталоге. Обязательное условие — свойства инфоблока в отдельной таблице (см. предыдущий раздел). Связка «отдельное хранение свойств + фасетный индекс» — база быстрого фильтра.

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

Оптимизация выборок на D7

Много медленности рождается не в самой базе, а в коде, который её неэффективно спрашивает. Классика антипаттерна — выбрать «всё обо всём» и отфильтровать в PHP, дёргать базу в цикле, тянуть лишние поля. API D7 (ORM) помогает писать точные запросы.

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

Кэширование как второй слой

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

В 1С-Битрикс работают несколько уровней: кэш компонентов, управляемый кэш с тегированной инвалидацией (обновляется точечно при изменении данных), композитный сайт для мгновенной отдачи статической части страниц. Правильная схема: оптимизированные запросы снижают стоимость промахов и пиковую нагрузку, а кэш убирает повторные обращения к базе на частых страницах. Вместе они дают устойчивую скорость под нагрузкой. Про то, как выкатывать такие изменения безопасно, — статья про CI/CD и деплой на 1С-Битрикс.

Настройки СУБД и сервера

Оптимизация запросов раскрывается полностью только на правильно настроенном окружении. Даже идеальные индексы упрутся в нехватку памяти под кэш базы или слабую конфигурацию сервера.

Настройка СУБД и сервера — фундамент, на котором работает всё остальное. Подробно роль окружения мы разбирали в материале про хостинг и инфраструктуру на BitrixVM.

Измерение результата

Оптимизация без измерений — это вера, а не инженерия. Каждое изменение нужно оценивать по метрикам «до» и «после», иначе легко потратить время на то, что не влияет на скорость.

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

Частые ошибки

Чек-лист оптимизации

  1. Slow log включён. Собраны реальные медленные запросы под нагрузкой.
  2. Запросы разобраны. Через EXPLAIN найдены полные сканы и отсутствующие индексы.
  3. Индексы под запросы. Добавлены нужные, убраны лишние индексы.
  4. Свойства вынесены. Крупные инфоблоки переведены на отдельное хранение свойств.
  5. Фасетный индекс построен. Умный фильтр работает по подготовленным данным.
  6. Выборки на D7. Точные select/filter/limit, нет запросов в цикле.
  7. Кэш настроен. Компоненты, тегированный кэш, композит на частых страницах.
  8. Результат измерен. Метрики до/после, нагрузочный тест на копии данных.

Вывод

На больших каталогах и под оптовой нагрузкой скорость 1С-Битрикс решается на уровне базы данных. Оптимизация начинается не с догадок, а с фактов: slow query log и EXPLAIN показывают, что именно тормозит. Дальше — точечные индексы под реальные запросы, перевод свойств инфоблоков в отдельное хранение, фасетный индекс для умного фильтра и эффективные выборки на D7.

Подкрепите это кэшированием и правильной настройкой СУБД — и каталог останется быстрым даже под пиком. Главное — работать измеримо: замер, гипотеза, исправление, повторный замер. Такой подход превращает «сайт тормозит» в управляемую и решаемую инженерную задачу, а быструю базу — в устойчивое конкурентное преимущество вашего магазина.

Частые вопросы

Почему сайт на 1С-Битрикс тормозит именно из-за базы?

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

Что такое slow query log и как его использовать?

Slow query log — журнал медленных запросов MySQL/MariaDB, куда попадают запросы, выполняющиеся дольше заданного порога. Это первый инструмент диагностики: включив его, вы получаете список реальных тяжёлых запросов на вашем сайте, а не догадки. Дальше каждый такой запрос анализируют через EXPLAIN и оптимизируют. Начинать оптимизацию без slow log — значит гадать; с ним вы точно знаете, что именно тормозит.

Как работает EXPLAIN и что в нём смотреть?

EXPLAIN показывает план выполнения запроса: какие таблицы и в каком порядке читаются, используются ли индексы, сколько строк перебирается. Ключевые сигналы проблемы — тип доступа ALL (полное сканирование таблицы), большое число строк в rows и отсутствие индекса в поле key. Цель оптимизации — заменить полные сканирования на доступ по индексу и уменьшить количество перебираемых строк. EXPLAIN превращает «медленно» в понятную причину.

Помогают ли индексы всегда или могут навредить?

Индексы ускоряют чтение, но замедляют запись и занимают место, поэтому их добавляют осознанно, а не на все поля подряд. Индекс оправдан на полях, по которым часто идёт фильтрация, сортировка и соединение таблиц. Избыточные и неиспользуемые индексы только тормозят вставку и обновление (например, при обмене с 1С) и раздувают базу. Правильная стратегия — индексировать под реальные запросы из slow log, а не про запас.

Что делать со свойствами инфоблоков на большом каталоге?

Свойства инфоблоков по умолчанию хранятся в общей таблице значений, и выборка по ним на большом каталоге медленная. Для таких инфоблоков включают режим хранения свойств в отдельной таблице (утилита конвертации в настройках инфоблока). Тогда фильтрация умного фильтра и выборки по свойствам идут по нормальной, индексируемой структуре и работают гораздо быстрее. Это одна из первых оптимизаций для крупных каталогов.

Как D7 и ORM помогают ускорить выборки?

API D7 (ORM) позволяет строить точные запросы: выбирать только нужные поля (select), фильтровать на стороне базы (filter), задавать сортировку и соединения, ограничивать выборку (limit). Это устраняет типичную проблему старого кода — выбор «всего обо всём» и обработку в PHP. Кроме того, D7 упрощает кэширование выборок. Грамотно написанный запрос на D7 переносит работу на базу, где она делается эффективнее, и снижает объём передаваемых данных.

Нужно ли кэшировать, если запросы уже оптимизированы?

Да, оптимизация запросов и кэширование дополняют друг друга. Даже быстрый запрос под высокой нагрузкой лучше не выполнять вовсе, если результат можно взять из кэша. Битрикс предлагает кэш компонентов, управляемый кэш с тегами, композитный сайт для статики. Оптимизированные запросы снижают стоимость «промаха» кэша и пиковую нагрузку, а кэш убирает повторные обращения к базе. Вместе они дают устойчивую скорость.

Как понять, что оптимизация действительно помогла?

Нужны измеримые метрики до и после: время ответа ключевых страниц, число и время медленных запросов в slow log, загрузка базы и сервера под нагрузкой, показатели Core Web Vitals. Оптимизацию проводят итеративно: замерили, нашли узкое место, исправили, снова замерили. Без измерений легко «оптимизировать» то, что не влияет на результат. Хорошая практика — нагрузочное тестирование на копии данных перед выкладкой изменений.

Поделиться:

Каталог тормозит под нагрузкой?

Найдём медленные запросы, оптимизируем индексы, свойства инфоблоков и выборки на 1С-Битрикс. Каталог станет быстрым даже на большом ассортименте.

Редакция B2Bsite

Команда B2Bsite. С 2014 года разрабатываем и ускоряем каталоги на 1С-Битрикс: оптимизация запросов, индексов, свойств инфоблоков и кэша для крупных B2B-проектов.

← Все статьи блога