Ответ
Как правило, нет. Булево поле (BOOLEAN, TINYINT(1)) имеет очень низкую кардинальность (всего 2-3 значения: true, false, возможно NULL). В такой ситуации оптимизатор СУБД часто предпочтет полное сканирование таблицы (full table scan) использованию индекса, так как это будет быстрее.
Когда индекс на булевом поле может быть полезен:
- Сильно неравномерное распределение данных. Например, если в таблице из миллионов строк только несколько тысяч записей имеют значение
is_active = true, то индекс поможет быстро их найти. - Как часть составного (композитного) индекса. Булево поле может быть полезным первым или последним ключом в индексе, если запросы часто фильтруют по нему в сочетании с другими полями.
Пример (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 для конкретных запросов и объема данных.