Индексы MySQL: ускорить ORM D7 и highload-блоки
Зачем это администратору Битрикс
Слой DataManager и highload-блоки описывают поля в PHP, но физическая таблица MySQL не «догоняет» смысл ваших фильтров и сортировок сама по себе. Если выборка по связке колонок упирается в полный перебор, один точечный CREATE INDEX часто даёт больше эффекта, чем долгие рефакторинги запросов на PHP — особенно на узких столбцах в условиях WHERE и в сортировках.
Что уже есть в таблице
Перед добавлением нового имени полезно увидеть текущий набор ключей: как называется индекс, какие колонки входят и уникален ли он. Стандартный просмотр для любой таблицы (подставьте реальное имя с префиксом ядра):
SHOW INDEX FROM b_hlblock_partner_zone;В выводе обратите внимание на столбцы Key_name, Seq_in_index и Column_name: по ним восстанавливается порядок полей в составном индексе.
Простой индекс и удаление
Имя индекса idx_city_ref может совпадать с логикой столбца или быть отдельным идентификатором внутри команды инфраструктуры. Для одной колонки достаточно такого шаблона:
CREATE INDEX idx_city_ref ON b_hlblock_partner_zone(city_ref);
DROP INDEX idx_city_ref ON b_hlblock_partner_zone;Удаление по имени удобно, когда индекс оказался лишним после смены бизнес-логики или когда нужно освободить место перед перестройкой схемы.
Составной индекс и порядок колонок
Для запросов вида WHERE region_code = ? AND status_flag = ? полезен индекс сразу на несколько полей. Порядок колонок в скобках не произволен: движок сравнивает их слева направо; на практике сначала ставят столбцы с лучшей «селективностью» (когда относительно мало повторяющихся значений), затем те, что сужают выдачу во вторую очередь. Это эвристика, а не строгая формула — финальную пользу всё равно лучше проверить планом запроса на копии базы.
CREATE INDEX idx_region_status ON b_hlblock_partner_zone(region_code, status_flag);Структура столбцов без ORM
Если нужно убедиться в системных именах и типах до правок DDL:
SHOW COLUMNS FROM b_hlblock_partner_zone;Ответ сверяйте с полями в getMap() у соответствующего класса ORM или таблицей highload-блока, чтобы не создать индекс по «чужому» алиасу.
Что учесть на продакшене
- Выполняйте
CREATE INDEXиDROP INDEXв окне с низкой нагрузкой: на больших InnoDB-таблицах построение может занять заметное время и дополнительный I/O. - Не плодите дублирующие индексы с перекрывающими наборами колонок без анализа: лишние структуры усложняют вставку и обновление.
- После изменения схемы зафиксируйте состав индексов в документации проекта или скрипте миграции, чтобы стейджинг совпадал с боем.
Итог
SHOW INDEX и SHOW COLUMNS — базовая диагностика; CREATE INDEX и DROP INDEX — контролируемое расширение ускорения под реальные фильтры D7 и highload-сущностей без переписывания ядра.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии