Эффективно ли индексировать булевы поля в SQL?

«Эффективно ли индексировать булевы поля в SQL?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Как правило, нет. Булево поле (BOOLEAN, TINYINT(1)) имеет очень низкую кардинальность (всего 2-3 значения: true, false, возможно NULL). В такой ситуации оптимизатор СУБД часто предпочтет полное сканирование таблицы (full table scan) использованию индекса, так как это будет быстрее.

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

  1. Сильно неравномерное распределение данных. Например, если в таблице из миллионов строк только несколько тысяч записей имеют значение is_active = true, то индекс поможет быстро их найти.
  2. Как часть составного (композитного) индекса. Булево поле может быть полезным первым или последним ключом в индексе, если запросы часто фильтруют по нему в сочетании с другими полями.

Пример (PostgreSQL):

-- Скорее всего, бесполезный индекс (данные распределены 50/50)
CREATE INDEX idx_order_completed ON orders(is_completed);

-- Потенциально полезный составной индекс
CREATE INDEX idx_active_user_created ON users(is_active, created_at) WHERE is_active = true;

-- Более эффективная альтернатива для фильтрации по флагу — партиционирование таблицы.

На практике решение об индексации всегда следует проверять через EXPLAIN ANALYZE для конкретных запросов и объема данных.