Иллюзия оптимизации: индекс на is_active только вредит Кажется… — SQL Academy: всё о реляционных БД и SQL — TG.ME

🤡 Иллюзия оптимизации: индекс на is_active только вредит

Кажется логичным: если в запросах часто есть WHERE is_active = true, на эту колонку нужен индекс. Но на деле база его проигнорирует, а ты лишь замедлишь работу системы.

⚙️ Почему база его не использует
Индексу важно разнообразие значений (кардинальность). Представь предметный указатель в конце книги: если слово встречается на 90% страниц, проще пролистать всю книгу целиком.
Оптимизатор рассуждает так же. Если значений всего два (true/false), он выберет полное сканирование таблицы (Seq Scan). Читать данные подряд намного быстрее, чем постоянно прыгать туда-сюда между индексом и таблицей.

📉 В чем реальный вред
Проигнорированный индекс становится мертвым грузом:
🔹 При каждом INSERT, UPDATE и DELETE базе приходится тратить время на обновление этой ненужной структуры.
🔹 Индекс впустую съедает место на диске и вытесняет из оперативной памяти действительно полезные данные.

🚀 Что делать
Если нужно быстро находить очень редкие статусы (например, 1% ошибок в логах), создавай частичный индекс:
CREATE INDEX idx_errors ON logs(status) WHERE status = 'error';

Он займет минимум места и будет реально использоваться.

💡 Индекс полезен, только когда он отсеивает подавляющее большинство строк, а не делит их пополам.
❤13👍11🤯3
August 5, 2026 4.3K 2 13