БесплатноБесплатный прототип ключевой страницы и черновик ТЗ при старте проекта
Ускорение и производительность

Оптимизация SQL-запросов на Битрикс: ищем и переписываем тяжёлые запросы

Находим тяжёлые SQL-запросы по slow query log и EXPLAIN, переписываем их, добавляем индексы, убираем N+1 и лишние выборки инфоблоков, настраиваем кеширование. Время ответа страниц падает, нагрузка на базу данных снижается.

10 летна нагруженных проектах Битрикс
500+переписанных тяжёлых запросов
до −80%времени ответа БД
EXPLAINразбор каждого запроса
SELECT * FROM b_iblock EXPLAIN type · rows INDEX по фильтру −80%
Что делаем

Что входит в оптимизацию SQL-запросов

Работаем по слою базы данных: находим тяжёлые запросы, разбираем планы выполнения, добавляем индексы, убираем N+1 и настраиваем кеширование выборок.

Поиск тяжёлых запросов

Включаем slow query log и профилировщик, выделяем самые дорогие и частые обращения к базе.

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

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

Индексы под фильтры

Добавляем и правим индексы под реальные фильтры и сортировки, убираем сканирование таблиц целиком.

Устранение N+1

Находим запросы, размноженные в циклах, и собираем данные одной выборкой вместо тысячи мелких.

Фильтрация инфоблоков и getList

Переводим фильтр на индексируемые поля, чистим select и параметры выборки от лишнего.

Кеширование выборок

Кешируем тяжёлые выборки и компоненты там, где данные меняются редко, снимая повторные запросы.

Подробно об услуге

Оптимизация SQL-запросов на Битрикс: что это и зачем

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

В отличие от общей оптимизации скорости, где работают сразу с кешем, версткой и сервером, эта услуга сфокусирована на одном слое — базе данных и запросах к ней. Именно он чаще всего остаётся непроработанным: кеш можно включить за час, а вот разобраться, почему конкретный getList отрабатывает за две секунды и грузит диск, — это адресная инженерная работа. Мы измеряем реальную нагрузку, выделяем десяток самых дорогих запросов, которые дают основной вклад в медленную работу, и бьём точечно по ним. Такой подход даёт максимальный эффект на вложенные часы: переписать три-четыре тяжёлых запроса часто важнее, чем перебрать сотню мелких.

Из чего складывается работа

Под капотом оптимизация запросов объединяет несколько связанных направлений, каждое из которых снимает свой класс проблем. Slow query log и профилировщик показывают, какие запросы выполняются дольше всего и как часто. EXPLAIN раскрывает план выполнения: где база читает по индексу, а где сканирует таблицу целиком. Индексы добавляют недостающие пути доступа, чтобы фильтр и сортировка работали по нужным колонкам. Устранение N+1 убирает запросы, размноженные в циклах. Фильтрация инфоблоков переводится на индексируемые поля и правильные методы выборки. А кеширование результатов снимает повторные обращения к базе там, где данные меняются редко.

Главные направления работы по оптимизации запросов:

  • сбор и анализ slow query log, выделение самых дорогих и частых запросов;
  • разбор плана выполнения через EXPLAIN: тип доступа, число строк, использование индексов;
  • добавление и корректировка индексов под реальные фильтры и сортировки;
  • устранение проблемы N+1 — запросов, размноженных в циклах выборки;
  • оптимизация фильтрации инфоблоков и параметров getList: поля, select, runtime;
  • кеширование тяжёлых выборок и управляемое кеширование компонентов;
  • переписывание самих SQL-запросов: убираем лишние JOIN, подзапросы и SELECT по всем полям.

Кому нужна оптимизация SQL-запросов на Битрикс

Услуга окупается там, где база данных стала узким местом. Это интернет-магазины и каталоги с десятками тысяч товаров, где фильтр и листинг тормозят. Это порталы и B2B-кабинеты с большими объёмами заказов и взаиморасчётов, где личный кабинет открывается секундами. Это HighLoad-проекты, где база нагружена в часы пик и упирается в процессор или диск. Общий признак один: страницы стали медленнее по мере роста данных, а сервер базы регулярно показывает высокую нагрузку. Чем больше таблицы и чем активнее трафик, тем заметнее эффект от переписывания тяжёлых запросов.

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

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

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

Фундамент услуги — измерения и план выполнения, а не догадки. Мы не переписываем запросы наугад и не добавляем индексы на всё подряд: лишние индексы замедляют запись и раздувают базу. Каждое решение подтверждается данными: до и после изменения видно, как изменился план, время и нагрузка. При необходимости работа стыкуется с настройкой самой СУБД и кеша, но фокус этой услуги — именно запросы и индексы. По итогам вы получаете список переписанных запросов, добавленных индексов и измеримый прирост скорости, который сохраняется при дальнейшем росте данных.

Результат оптимизации SQL-запросов на Битрикс — это быстрые страницы и разгруженная база данных. Время ответа на тяжёлых разделах падает в разы, нагрузка на сервер базы снижается, проект перестаёт упираться в процессор и диск в часы пик и спокойно держит рост трафика и каталога. Менеджеры и клиенты работают без задержек, а вы экономите на железе, которое иначе пришлось бы наращивать под неоптимальные запросы.

Как это работает

Путь тяжёлого запроса от поиска до ускорения

Запрос попадает в slow query log, мы разбираем его план через EXPLAIN, добавляем индекс или переписываем выборку, проверяем под нагрузкой и фиксируем падение времени ответа.

Slow logдолгие запросы EXPLAINплан · rows Индекспереписываем Проверкапод нагрузкой Каждое изменение подтверждается планом выполнения и замером времени до и после
Slow log → EXPLAIN → индекс или переписывание → проверка → быстрый ответ.
Сравнение

Кто оптимизирует запросы и чем это отличается

Тяжёлые запросы можно глушить мощным железом, чинить силами штатного программиста или адресно переписывать с разбором планов. Разница — в устойчивости результата.

Критерий Нарастить железоШтатный программистСтудия B2Bsite
Подход к причине Маскирует проблемуПо мере силАдресно по slow log
Замер эффекта НетЧастичноДа, до и после
Стоимость в долгую Растёт постоянноЗарплатаРазовая работа
Компетенции по БД Не нужныЗависит от опытаEXPLAIN и индексы
Результат Вернётся с ростом данныхБез замеров наугадУстойчивый, измеримый
Где база теряет скорость

Типичные причины медленных запросов на Битрикс

Большинство тормозов базы данных сводится к нескольким повторяющимся ошибкам в запросах. Ниже — что мы находим чаще всего и как это лечим.

Запрос в цикле выборки порождает тысячи мелких обращений к базе (N+1).
Собираем данные одной выборкой по списку идентификаторов вместо запроса на каждую строку.
Фильтр инфоблока идёт без индекса и сканирует всю таблицу свойств.
Переводим фильтр на индексируемые поля, добавляем нужные индексы и правим параметры выборки.
getList тянет все поля и лишние строки, которые потом отбрасываются.
Чистим select до нужных полей, добавляем лимиты и фильтры, убираем избыточные runtime-поля.
Тяжёлая выборка выполняется на каждый хит, хотя данные меняются раз в сутки.
Кешируем результат выборки и компоненты с управляемым кешем, снимая повторные запросы к базе.
Сложный запрос с лишними JOIN и подзапросами читает миллионы строк.
Переписываем запрос по плану EXPLAIN: убираем лишние соединения, выносим подзапросы, добавляем индексы.
Этапы работы

Как мы оптимизируем SQL-запросы

Идём измеримо: сначала находим тяжёлые запросы, потом переписываем по приоритету и проверяем эффект на тех же метриках.

01

Снимаем базовые метрики

Включаем slow query log и профилировщик, фиксируем время ответа страниц и нагрузку на базу до изменений.

02

Строим список тяжёлых запросов

Выделяем самые дорогие и частые обращения к базе, которые дают основной вклад в медленную работу.

03

Разбираем планы через EXPLAIN

Читаем план выполнения каждого запроса: тип доступа, число строк, индексы и временные таблицы.

04

Переписываем и индексируем

Добавляем индексы, чистим выборки, убираем N+1, переписываем тяжёлые SQL-запросы без потери логики.

05

Проверяем под нагрузкой

Прогоняем изменения под нагрузкой, сверяем план и время до и после, фиксируем прирост скорости.

06

Сдаём отчёт и рекомендации

Передаём список переписанных запросов, добавленных индексов и метрики, даём рекомендации на будущее.

Сроки

Сколько занимает оптимизация запросов

1–2 дня Сбор slow query log и профилирование
1
2–3 дня Разбор планов и список приоритетов
2
3–7 дней Переписывание запросов и индексы
3
1–2 дня Проверка под нагрузкой и замеры
4
1 день Отчёт и рекомендации команде
5
Тарифы

Сколько стоит оптимизация SQL-запросов

Стоимость зависит от объёма базы, числа тяжёлых запросов и сложности логики. Ниже — ориентиры; точную смету присылаем после короткого аудита slow query log, бесплатно.

Экспресс-аудит запросов
от 25 000 ₽
Срок: от 3 дней

Находим тяжёлые запросы и даём план оптимизации с приоритетами.

  • Сбор slow query log
  • Разбор планов EXPLAIN
  • Список тяжёлых запросов
  • План оптимизации с приоритетами
Популярный выбор
Оптимизация запросов
от 60 000 ₽
Срок: от 1 недели

Переписываем тяжёлые запросы, добавляем индексы, убираем N+1.

  • Всё из экспресс-аудита
  • Переписывание тяжёлых запросов
  • Индексы под фильтры и сортировки
  • Устранение N+1 и чистка getList
  • Замеры до и после
База под нагрузку
от 140 000 ₽
Срок: от 2 недель

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

  • Всё из тарифа «Оптимизация запросов»
  • Кеширование тяжёлых выборок
  • Оптимизация фильтрации каталога
  • Нагрузочное тестирование
  • Рекомендации по настройке СУБД
Экспресс-аудит запросов от 25 000 ₽
Срок: от 3 дней

Находим тяжёлые запросы и даём план оптимизации с приоритетами.

  • Сбор slow query log
  • Разбор планов EXPLAIN
  • Список тяжёлых запросов
  • План оптимизации с приоритетами
Популярный Оптимизация запросов от 60 000 ₽
Срок: от 1 недели

Переписываем тяжёлые запросы, добавляем индексы, убираем N+1.

  • Всё из экспресс-аудита
  • Переписывание тяжёлых запросов
  • Индексы под фильтры и сортировки
  • Устранение N+1 и чистка getList
  • Замеры до и после
База под нагрузку от 140 000 ₽
Срок: от 2 недель

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

  • Всё из тарифа «Оптимизация запросов»
  • Кеширование тяжёлых выборок
  • Оптимизация фильтрации каталога
  • Нагрузочное тестирование
  • Рекомендации по настройке СУБД

Дополнительные опции

Оптимизация умного фильтра каталога от 35 000 ₽
Настройка кеширования компонентов и выборок от 30 000 ₽
Регулярный мониторинг медленных запросов от 15 000 ₽ в месяц
Калькулятор услуги

Сколько вы теряете на медленных запросах

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

Потери из-за медленных страниц в месяц 0 ₽

Оценка по формуле: посетители × доля медленных страниц × доход с посетителя × 0,1 (доля, которую теряете на отказах из-за задержек). Это ориентир, а не гарантия.

Умный расчёт

Рассчитайте стоимость оптимизации запросов

Ответьте на несколько вопросов о вашем проекте — прикинем объём работ и сориентируем по стоимости и срокам оптимизации запросов.

Вопрос 1
Загрузка вопроса…

Примеры работ

Кейсы оптимизации SQL-запросов

Интернет-магазин

Ускорили каталог на 200 тысячах товаров

Переписали фильтр на индексируемые поля и закешировали выборки — листинг и фильтр перестали тормозить.

−78%Время фильтра
−55%Нагрузка БД
8 днейСрок
B2B-портал

Убрали N+1 в личном кабинете контрагента

Заменили запросы в цикле одной выборкой по заказам и взаиморасчётам — кабинет стал открываться мгновенно.

−92%Запросов на странице
×6Время ответа
5 днейСрок
HighLoad-проект

Сняли пиковую нагрузку на базу данных

Разобрали slow query log, добавили индексы и кеш тяжёлых выборок — сервер базы перестал упираться в диск.

−65%Нагрузка в пик
−90%Slow queries
2 неделиСрок
Отзывы клиентов

Что говорят о результате

«Каталог на двести тысяч товаров еле дышал в часы пик. Команда нашла тяжёлые запросы по slow log, переписала фильтр и добавила индексы. Время ответа упало в разы, нагрузка на базу заметно снизилась. Всё с замерами до и после.»

Алексей Громов Руководитель ИТ, интернет-магазин

«Личный кабинет контрагента открывался по пять секунд. Оказалось, классический N+1 — запросы в цикле. Ребята собрали данные одной выборкой, и страница стала летать. Объяснили причину на пальцах и показали план EXPLAIN.»

Марина Соколова Директор по развитию, B2B-портал

«Сервер базы упирался в диск каждый вечер. Провели аудит запросов, переписали самые тяжёлые и закешировали выборки. Пиковая нагрузка ушла, апгрейд железа отложили на неопределённый срок. Прозрачно и по делу.»

Дмитрий Орлов Технический директор, HighLoad-проект
Почему мы

На что можно рассчитывать по договору

Работаем по данным

Каждое изменение подтверждается планом EXPLAIN и замером времени до и после, а не догадками.

Бьём по приоритету

Сначала переписываем самые тяжёлые и частые запросы — они дают основной прирост скорости.

Не ломаем обновляемость

Меняем запросы и индексы аккуратно, не правя ядро, чтобы обновления Битрикса проходили чисто.

Прозрачный отчёт

Передаём список переписанных запросов, добавленных индексов и метрики прироста скорости.

База знаний

Частые вопросы об оптимизации запросов — и наш ответ

Это не общие советы, а закономерности из реальных нагруженных проектов на Битрикс. Каждый ответ — позиция нашей команды.

Диагностика

Сайт тормозит, но непонятно из-за чего именно

Наш ответ

Включаем slow query log и профилировщик и строим список самых дорогих запросов. Обычно 80 процентов задержки дают три-пять обращений к базе. Их и разбираем через EXPLAIN в первую очередь, а не гадаем по симптомам.

Индексы

Стоит ли добавить индексы на все колонки сразу

Наш ответ

Нет. Лишние индексы замедляют запись и раздувают базу. Мы добавляем индексы только под реальные фильтры и сортировки, которые видны в плане EXPLAIN, и проверяем, что запрос действительно стал читать по индексу, а не сканировать таблицу.

N+1

Что такое N+1 и почему он так бьёт по скорости

Наш ответ

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

Кеш

Поможет ли просто включить кеширование

Наш ответ

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

Экспертный взгляд

Переписать запросы или нарастить железо

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

Почему именно запросы становятся узким местом

1С-Битрикс — это богатая платформа со множеством абстракций: инфоблоки, компоненты, ORM, выборки getList. Они удобны для разработки, но легко порождают неоптимальные обращения к базе, если их применять без оглядки на план выполнения. Самый частый сценарий — запрос внутри цикла: код перебирает список товаров или заказов и на каждой итерации лезет в базу за деталями. На десяти элементах это незаметно, на тысяче — страница встаёт. Второй частый случай — фильтр по неиндексированному свойству инфоблока: база вынуждена прочитать всю таблицу свойств целиком, чтобы отобрать нужные строки. Третий — выборка по всем полям и без лимитов, когда из базы тянутся данные, которые тут же отбрасываются.

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

Что меняет адресная оптимизация

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

Важно, что оптимизация запросов — это часть более широкой работы по ускорению. Если узкое место не только в базе, но и в кеше, верстке или сервере, мы подключаем смежные направления. Глубокая настройка самой СУБД, индексов на уровне сервера и параметров движка — это оптимизация MySQL и PostgreSQL для Битрикс, которая хорошо дополняет переписывание запросов. А если нужно сперва точно понять, какие именно запросы тормозят и сколько их, начинают с услуги аудит медленных SQL-запросов на Битрикс — на нём собирается полная картина по slow query log и строится план. Все эти услуги относятся к направлению база данных и запросы, и мы подбираем нужную комбинацию под конкретный проект.

Чем переписывание запросов отличается от наращивания железа

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

Со штатным программистом ситуация мягче, но риск тот же: без замеров и понимания планов выполнения правки делаются наугад. Добавили индекс на всё подряд — замедлили запись и раздули базу. Переписали запрос на ощупь — изменили логику и получили баг. Мы работаем иначе: сначала измеряем, потом меняем, потом снова измеряем. Каждое решение подтверждается данными до и после, поэтому ни логика проекта, ни его обновляемость не страдают.

Когда оптимизация запросов окупается, а когда хватит малого

Мы не уговариваем всех подряд заказывать глубокую оптимизацию. Она оправдана, когда база реально стала узким местом: страницы тормозят под объёмом данных, сервер базы регулярно показывает высокую нагрузку, slow query log полон тяжёлых запросов. В этом случае переписывание окупается ускорением страниц, снятой нагрузкой и отложенным апгрейдом железа. Если же проект небольшой, данных немного, а тормозит он по другой причине — например, из-за выключенного кеша или медленного хостинга, — иногда достаточно точечной правки, и городить полноценную оптимизацию запросов не нужно. На бесплатном аудите мы честно говорим, в чём корень проблемы и что выгоднее сделать в первую очередь.

Как мы ведём работу

Старт — это снятие базовых метрик. Мы включаем сбор медленных запросов, профилируем типовые страницы и фиксируем текущее время ответа и нагрузку на базу. Без этой точки отсчёта невозможно доказать эффект, поэтому мы всегда начинаем с измерений. Дальше строим список самых дорогих и частых запросов и разбираем каждый через EXPLAIN: смотрим тип доступа, число прочитанных строк, использование индексов и временных таблиц. На основе этого решаем, что делать с конкретным запросом — добавить индекс, переписать выборку, убрать N+1 или закешировать результат.

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

Сценарии, под которые мы оптимизируем

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

Для B2B-портала и личных кабинетов узким местом чаще оказывается N+1: страница кабинета собирает заказы, документы и взаиморасчёты контрагента запросами в цикле. Мы заменяем их одной выборкой по списку, и страница, открывавшаяся секундами, начинает летать. Для HighLoad-проектов на первый план выходит пиковая нагрузка на сервер базы: в часы пик база упирается в процессор или диск из-за нескольких частых тяжёлых запросов. Их переписывание и кеширование снимают пик и позволяют держать рост трафика без апгрейда железа.

Чем точечная оптимизация выгоднее альтернатив

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

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

Гарантии и прозрачность

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

Возражения, которые мы слышим чаще всего

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

С чего начать

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

Вопросы и ответы

Частые вопросы об оптимизации SQL-запросов

Что такое оптимизация SQL-запросов простыми словами? +

Это поиск и переписывание тяжёлых обращений к базе данных, из-за которых страницы открываются медленно. Мы находим, какие запросы выполняются дольше всего, разбираем, почему они медленные, и меняем их так, чтобы база отвечала за миллисекунды. Проще говоря, мы учим базу делать ту же работу, но в разы быстрее.

Что такое slow query log? +

Это журнал медленных запросов, который ведёт сама база данных. В него попадают все запросы, выполнявшиеся дольше заданного порога, вместе со временем и частотой. Slow query log — главный инструмент диагностики: по нему видно, какие именно запросы тормозят проект, а не приходится гадать по симптомам.

Что показывает команда EXPLAIN? +

EXPLAIN раскрывает план выполнения запроса: как база собирается его выполнять. Видно тип доступа (читает по индексу или сканирует таблицу целиком), сколько строк она перебирает, какие индексы использует и создаёт ли временные таблицы. Это позволяет понять причину медленного запроса и точно решить, что в нём исправить.

Что такое проблема N+1? +

Это когда код делает один запрос на список и ещё по отдельному запросу на каждый его элемент. На списке из ста элементов получается сто один запрос вместо двух. N+1 почти не виден в коде, но сильно тормозит страницы под объёмом данных. Лечится сбором всех данных одной выборкой по списку идентификаторов.

Что такое индекс в базе данных? +

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

Как вы находите тяжёлые запросы? +

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

Можно ли провести диагностику без остановки сайта? +

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

Сколько запросов обычно даёт основную задержку? +

Чаще всего работает правило: около 80 процентов задержки приходится на три-пять самых тяжёлых и частых запросов. Поэтому нет смысла трогать всё подряд — мы выделяем эти ключевые запросы и переписываем их. Эффект от такой точечной работы максимальный на вложенные часы.

Чем оптимизация запросов отличается от общей оптимизации скорости? +

Общая оптимизация работает сразу со всеми слоями: кеш, верстка, картинки, сервер. Оптимизация запросов сфокусирована на одном слое — базе данных и обращениях к ней. Если узкое место именно в базе, эта услуга даёт прицельный эффект. Часто её совмещают с настройкой кеша и сервера, но фокус остаётся на запросах.

Вы добавляете индексы на все колонки сразу? +

Нет. Лишние индексы замедляют запись и раздувают базу. Мы добавляем индексы только под реальные фильтры и сортировки, которые видны в плане EXPLAIN, и проверяем, что запрос действительно стал читать по индексу. Это точечная, а не массовая индексация.

Как вы оптимизируете фильтрацию инфоблоков? +

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

Что вы делаете с getList и выборками ORM? +

Чистим список запрашиваемых полей до нужных, добавляем фильтры и лимиты, убираем избыточные runtime-поля и лишние соединения. Часто getList тянет все поля и лишние строки, которые потом отбрасываются — мы оставляем ровно то, что используется. Это снижает объём чтения и ускоряет выборку.

Поможет ли просто включить кеширование? +

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

Что вы делаете с самими тяжёлыми SQL-запросами? +

Разбираем план через EXPLAIN и переписываем: убираем лишние JOIN и подзапросы, заменяем SELECT по всем полям на нужные колонки, добавляем индексы под условия и сортировку. Цель — чтобы запрос читал сотни строк по индексу вместо миллионов сканированием. Логику при этом сохраняем неизменной.

Кешируете ли вы результаты тяжёлых выборок? +

Да, там где данные меняются редко. После того как сам запрос переписан и стал быстрым, мы дополнительно кешируем его результат и компоненты с управляемым кешем, чтобы снять повторные обращения к базе на каждом хите. Сброс кеша настраиваем по событиям изменения данных, поэтому в кеше не залёживаются устаревшие значения.

Насколько реально ускорить страницы? +

На проектах с тяжёлыми запросами время ответа на проблемных разделах падает в разы, а иногда в десятки раз — особенно когда лечится N+1 или фильтр без индекса. Точную цифру называем после аудита: она зависит от того, насколько неоптимальны текущие запросы. Эффект всегда подтверждаем замерами до и после.

Не сломает ли переписывание логику сайта? +

Нет. Мы меняем запросы измеримо и аккуратно, сверяя результат до и после, и не трогаем ядро Битрикса напрямую. Каждое изменение откатываемо, а при необходимости отрабатывается на копии проекта. Цель — та же логика, но быстрее, поэтому риск поломки минимален.

Сохранится ли результат при росте данных? +

Да, в этом и смысл адресной оптимизации. Если запрос стал читать по индексу сотни строк вместо миллионов, он останется быстрым и на выросшей базе. В отличие от наращивания железа, которое лишь откладывает проблему, переписанный запрос даёт устойчивый эффект при разумном росте данных и трафика.

Чем оптимизация запросов лучше покупки мощного сервера? +

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

Сколько стоит оптимизация SQL-запросов? +

Экспресс-аудит с поиском тяжёлых запросов и планом обычно начинается от 25 000 рублей, переписывание тяжёлых запросов с индексами — от 60 000, глубокая работа для нагруженных проектов — от 140 000. Цена зависит от объёма базы, числа тяжёлых запросов и сложности логики. Точную смету присылаем после короткого аудита.

За какой срок реально получить результат? +

Сбор slow query log и разбор планов занимают пару дней, переписывание ключевых запросов — от нескольких дней до пары недель в зависимости от объёма. Часто первые заметные ускорения видны уже на второй-третий день, когда переписаны самые тяжёлые запросы. Точный срок фиксируем после аудита.

Можно ли заказать только аудит запросов? +

Да. Экспресс-аудит — это отдельная услуга: мы собираем slow query log, разбираем планы и даём список тяжёлых запросов с приоритетами и планом оптимизации. Дальше вы решаете, делать переписывание своими силами по нашему плану или доверить его нам. Аудит ни к чему не обязывает.

Что мы получаем по итогу работы? +

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

Нужна ли отдельная настройка самой базы данных? +

Иногда да. Переписывание запросов и индексы дают основной эффект, но на нагруженных проектах их хорошо дополняет настройка самой СУБД — параметров движка, буферов и индексов на уровне сервера. Это отдельное направление; если оно нужно, мы скажем об этом на аудите и предложим совместить работы.

Начать проект

Найдём и перепишем ваши тяжёлые запросы?

Расскажите о проекте и симптомах — соберём slow query log, покажем самые тяжёлые запросы и пришлём план оптимизации с оценкой эффекта.

  • Ответим в течение рабочего дня
  • Бесплатный аудит процессов и расчёт
  • NDA и фиксированная смета