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

Стоит ли создавать индекс на столбце, который может иметь только два значения?

2.0 Middle🔥 141 комментариев
#Базы данных и SQL

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

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

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

# Создание индекса на столбце с двумя значениями: анализ целесообразности

Краткий ответ

В большинстве случаев создавать индекс НЕ стоит, но есть исключения. Решение зависит от специфики данных, типа запросов и объёма таблицы.

Почему индексы обычно неэффективны на бинарных столбцах

1. Низкая селективность (low cardinality)

Бинарный столбец имеет селективность ~50% (для идеально распределённых данных), что означает:

  • Индекс укажет на половину всех строк таблицы
  • База данных часто выбирает полный скан таблицы вместо использования индекса
  • Это быстрее, чем чтение индекса + чтение данных со случайным доступом

2. Избыточные затраты

  • Индекс занимает дополнительное дисковое пространство
  • При INSERT/UPDATE/DELETE нужно обновлять индекс
  • Это замедляет операции записи без соответствующего прироста скорости чтения

3. Правило селективности

Индексы эффективны, когда селективность < 10-20% (результат охватывает менее 10-20% таблицы).

Когда индекс всё же может быть полезен

1. В composite-индексе (часть составного индекса)

CREATE INDEX idx_status_date ON users(status, created_date);

Добавление высокоселективного столбца в конец может улучшить индекс (index-only scan).

2. Маленькие таблицы

Для таблиц с 1000-10000 строк индекс практически не помогает, так как полный скан уже быстрый.

3. Index-only scans

Если запрос выбирает только индексированные столбцы:

SELECT status FROM users WHERE status = 'active';

4. Фильтрация с другими условиями

Если часто используется вместе с высокоселективным столбцом.

Практические рекомендации

Проверка перед созданием индекса

SELECT status, COUNT(*) FROM users GROUP BY status;

Итоговые правила

СценарийИндекс?Причина
Маленькая таблица (<100k)НетПолный скан быстрее
Большая таблица + бинарныйНетНизкая селективность
Составной индексДаУлучшает фильтрацию
Index-only scanДаИзбегает доступа к таблице
Частые UPDATE/DELETEНетЗатраты на обновление

Ответ на собеседовании

Правильный ответ: "В большинстве случаев НЕ стоит, потому что селективность около 50% делает индекс неэффективным. База выберет полный скан таблицы. Однако индекс может быть полезен как часть составного индекса с высокоселективным столбцом, или при index-only scans. Всегда нужно проверить EXPLAIN план и измерить реальное улучшение."

Это демонстрирует понимание того, как работают индексы, и практический подход к оптимизации.

Стоит ли создавать индекс на столбце, который может иметь только два значения? | PrepBro