Yandex Metrika
sanches.free 1 просмотр

Индексы 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 дней гарантии