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

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

Ответ

Индексы на булевых полях обычно неэффективны, так как у них низкая селективность (всего 2 значения). В большинстве СУБД (PostgreSQL, MySQL) индекс на поле is_active BOOLEAN будет бесполезен, если распределение значений примерно 50/50.

Исключения:

  1. Когда одно значение встречается редко (например, is_admin где админов <1%)
  2. Для частичных индексов (PostgreSQL):
CREATE INDEX idx_is_active ON users(is_active) WHERE is_active = true;

Пример на Go с GORM:

// Плохо (индекс не поможет)
type User struct {
    IsActive bool `gorm:"index"` 
}

// Лучше (частичный индекс)
db.Model(&User{}).Where("is_active = ?", true).AddIndex("idx_is_active", "is_active")

Всегда анализируйте запросы через EXPLAIN перед добавлением индексов.