Антон Долганин

Я инженер, который решает задачи, а не пишет на языке. Архитектура, разработка, DevOps — подбираю инструменты под цель, строю решения, которые работают в проде и масштабируются без боли.

Выглядит разумно — добавить индекс на поле is_active. Но в PostgreSQL это часто не ускоряет, а замедляет.

Почему так?

BOOLEAN всего три значения: true, false, NULL.

Если распределение значений близко к 50/50 — индекс почти бесполезен. Планировщик чаще выберет Seq Scan, чем использование B-tree.

Индекс эффективен, если:

  • Одно значение встречается значительно реже
  • Вы часто запрашиваете только "редкие" строки (WHERE is_active = false, если таких 1%)

Варианты:

  1. Вместо индекса: частичный индекс
CREATE INDEX idx_active_false ON users (id) WHERE is_active = false;
  1. Или вообще не индексировать — если таблица маленькая, Postgres справится сам.

PostgreSQL: не спеши индексировать BOOLEAN