← Назад к вопросам

Какие поля нужно индексировать?

1.7 Middle🔥 151 комментариев
#Запросы и оптимизация#СУБД и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие поля нужно индексировать

Индексирование — это один из важнейших инструментов оптимизации производительности в 1С. Правильно спроектированные индексы могут ускорить запросы в сотни раз.

Обязательно индексируйте

Поля, используемые в WHERE условиях:

  • Это основной критерий для индексирования
  • Если часто фильтруете по полю, создавайте индекс
  • Примеры: контрагент, статус, дата документа

Поля иностранных ключей:

  • Используются в JOIN-операциях
  • Связывают таблицы между собой
  • Обязательны для быстрого соединения таблиц
  • Примеры: Товар, Контрагент, Подразделение

Поля в ORDER BY и GROUP BY:

  • Сортировка и группировка требуют индексов
  • Ускоряют агрегирование данных
  • Важны для отчётов и аналитики

Поля с высокой селективностью:

  • Селективность > 90% (много уникальных значений)
  • Примеры: код товара, номер документа, УИД
  • Индекс будет эффективным

НЕ индексируйте

Поля с низкой селективностью:

  • Селективность < 10% (мало уникальных значений)
  • Примеры: статус (только несколько значений), активность
  • Индекс будет неэффективным

BLOB и TEXT поля:

  • Большие бинарные данные
  • Текстовые поля с неограниченной длиной
  • Индексирование замедляет обновление данных

Часто изменяемые поля:

  • Поля с высокой волатильностью
  • Индексы требуют перестройки при каждом обновлении
  • Замедляют INSERT и UPDATE операции

Редко используемые поля:

  • Если поле не участвует в запросах
  • Нет смысла создавать индекс
  • Только замедлит обновление данных

Примеры индексов

// Справочник Товары
// Индекс на Наименование (часто ищут по названию)
Индекс = Справочник.Товары.Индексы.Добавить();
Индекс.Поля.Добавить(Справочник.Товары.Поле("Наименование"));

// Комбинированный индекс
// Часто ищут товары по Категории И Производителю вместе
Индекс = Справочник.Товары.Индексы.Добавить();
Индекс.Поля.Добавить(Справочник.Товары.Поле("Категория"));
Индекс.Поля.Добавить(Справочник.Товары.Поле("Производитель"));

// Регистр остатков - индексы по измерениям
Индекс = РегистрНакопления.ОстаткиТоваров.Индексы.Добавить();
Индекс.Поля.Добавить(РегистрНакопления.ОстаткиТоваров.Поле("Товар"));
Индекс.Поля.Добавить(РегистрНакопления.ОстаткиТоваров.Поле("Склад"));

Рекомендации по типам

Тип данныхРекомендацияПримеры
UUIDДа, всегдаСсылки на справочники, документы
ДатаДа, частоДата создания, дата операции
ЧислоДаКоличество, сумма, цена
СтрокаДа (если селективно)Наименование, код
ЛогическийНетАктивен, архив
BLOBНетКартинки, файлы

Правило 80/20

  • 80% запросов используют 20% полей
  • Сосредоточьтесь на этих полях
  • Остальные индексы часто бесполезны
  • Профилируйте реальные запросы

Оптимизация комбинированных индексов

// Если запросы: 
// SELECT * WHERE Категория = ? AND Тип = ? AND Цена > ?
// Правильный порядок в индексе:
// 1. Категория (точное равенство)
// 2. Тип (точное равенство)
// 3. Цена (диапазонное сравнение в конце)

Проверка эффективности

  1. Используйте план выполнения запроса (EXPLAIN в SQL)
  2. Измеряйте время выполнения с индексом и без
  3. Проверяйте, используется ли индекс в запросе
  4. Удаляйте неиспользуемые индексы
  5. Пересчитывайте статистику индексов

Индексирование требует баланса: слишком мало индексов — медленные запросы, слишком много — медленное обновление данных.