Gymterview
middle

Имеет ли смысл индексировать данные с небольшим количеством возможных значений?

В общем случае нет. Индексирование столбцов с низкой кардинальностью (малым числом уникальных значений) обычно неэффективно, потому что индекс не сужает выборку достаточно сильно.

Почему индекс неэффективен при низкой кардинальности

Если столбец 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), тем эффективнее индекс

На собеседовании: не стоит отвечать просто «нет». Интервьюер хочет услышать про исключения: перекошенное распределение и частичные индексы. Частая ошибка — не упомянуть, что ответ зависит от распределения данных, а не только от числа уникальных значений.