← Назад к вопросам
Какие поля нужно индексировать?
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. Цена (диапазонное сравнение в конце)
Проверка эффективности
- Используйте план выполнения запроса (EXPLAIN в SQL)
- Измеряйте время выполнения с индексом и без
- Проверяйте, используется ли индекс в запросе
- Удаляйте неиспользуемые индексы
- Пересчитывайте статистику индексов
Индексирование требует баланса: слишком мало индексов — медленные запросы, слишком много — медленное обновление данных.