Кажется логичным: если в запросах часто есть
WHERE is_active = true, на эту колонку нужен индекс. Но на деле база его проигнорирует, а ты лишь замедлишь работу системы.⚙️ Почему база его не использует
Индексу важно разнообразие значений (кардинальность). Представь предметный указатель в конце книги: если слово встречается на 90% страниц, проще пролистать всю книгу целиком.
Оптимизатор рассуждает так же. Если значений всего два (true/false), он выберет полное сканирование таблицы (Seq Scan). Читать данные подряд намного быстрее, чем постоянно прыгать туда-сюда между индексом и таблицей.
📉 В чем реальный вред
Проигнорированный индекс становится мертвым грузом:
🔹 При каждом
INSERT, UPDATE и DELETE базе приходится тратить время на обновление этой ненужной структуры.🔹 Индекс впустую съедает место на диске и вытесняет из оперативной памяти действительно полезные данные.
🚀 Что делать
Если нужно быстро находить очень редкие статусы (например, 1% ошибок в логах), создавай частичный индекс:
CREATE INDEX idx_errors ON logs(status) WHERE status = 'error';
Он займет минимум места и будет реально использоваться.
💡 Индекс полезен, только когда он отсеивает подавляющее большинство строк, а не делит их пополам.


