Имеет ли смысл индексировать данные с небольшим количеством возможных значений?
В общем случае нет. Индексирование столбцов с низкой кардинальностью (малым числом уникальных значений) обычно неэффективно, потому что индекс не сужает выборку достаточно сильно.
Почему индекс неэффективен при низкой кардинальности
Если столбец gender содержит только значения M и F, то индекс по нему отбирает примерно 50% строк. При таком объёме выборки полное сканирование таблицы многоблочным чтением обычно быстрее, чем множество одноблочных чтений через индекс.
Правило: если объём данных, не удовлетворяющих условию выборки, меньше размера самого индекса, то индекс замедляет запрос вместо ускорения.
Когда всё-таки имеет смысл
| Ситуация | Пояснение |
|---|---|
| Сильно перекошенное распределение | 99% записей active = true, 1% active = false. Индекс полезен для поиска false |
| Частичный индекс | CREATE INDEX idx ON users(email) WHERE active = false — индексирует только 1% строк |
| Битовый индекс (bitmap) | В OLAP-системах эффективен при низкой кардинальности (Oracle, PostgreSQL при Bitmap Index Scan) |
| Составной индекс | Столбец с низкой кардинальностью + столбец с высокой: (status, created_at) |
Кардинальность и селективность
- Кардинальность — количество уникальных значений в столбце
- Селективность = кардинальность / общее количество строк
- Чем выше селективность (ближе к 1.0), тем эффективнее индекс
На собеседовании: не стоит отвечать просто «нет». Интервьюер хочет услышать про исключения: перекошенное распределение и частичные индексы. Частая ошибка — не упомянуть, что ответ зависит от распределения данных, а не только от числа уникальных значений.