Ответ
Как правило, нет. Создание индекса на столбце с очень низкой кардинальностью (например, gender со значениями 'M'/'F' или is_active с true/false) обычно неэффективно.
Причины:
- Низкая избирательность: При запросе
WHERE status = 'ACTIVE'индекс вернет очень большой процент строк таблицы (до ~50%). В этом случае оптимизатор СУБД часто игнорирует индекс и выполняет полное сканирование таблицы (Full Table Scan), так как это быстрее. - Накладные расходы: Индекс занимает место на диске, а его поддержка (при INSERT/UPDATE/DELETE) замедляет эти операции, не давая существенного выигрыша в скорости SELECT.
Когда это МОЖЕТ быть оправдано:
- Сильный перекос в распределении данных (Data Skew): Если одно значение встречается крайне редко (например,
is_admin = trueу 0.1% записей), индекс для поиска этого редкого значения будет эффективен. - Составной индекс: Столбец с двумя значениями может быть полезной первой частью составного индекса. Например, индекс
(status, created_date)позволит быстро находить все записи с определенным статусом, отсортированные по дате.
Рекомендация: Измеряйте производительность запросов с помощью EXPLAIN ANALYZE. Создавайте индекс только если он заметно ускоряет критически важные запросы, а таблица достаточно велика.