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

«Стоит ли создавать индекс в БД для столбца, который может иметь только два значения?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Как правило, нет. Создание индекса на столбце с очень низкой кардинальностью (например, gender со значениями 'M'/'F' или is_active с true/false) обычно неэффективно.

Причины:

  • Низкая избирательность: При запросе WHERE status = 'ACTIVE' индекс вернет очень большой процент строк таблицы (до ~50%). В этом случае оптимизатор СУБД часто игнорирует индекс и выполняет полное сканирование таблицы (Full Table Scan), так как это быстрее.
  • Накладные расходы: Индекс занимает место на диске, а его поддержка (при INSERT/UPDATE/DELETE) замедляет эти операции, не давая существенного выигрыша в скорости SELECT.

Когда это МОЖЕТ быть оправдано:

  1. Сильный перекос в распределении данных (Data Skew): Если одно значение встречается крайне редко (например, is_admin = true у 0.1% записей), индекс для поиска этого редкого значения будет эффективен.
  2. Составной индекс: Столбец с двумя значениями может быть полезной первой частью составного индекса. Например, индекс (status, created_date) позволит быстро находить все записи с определенным статусом, отсортированные по дате.

Рекомендация: Измеряйте производительность запросов с помощью EXPLAIN ANALYZE. Создавайте индекс только если он заметно ускоряет критически важные запросы, а таблица достаточно велика.