Почему индекс в PostgreSQL не всегда спасает?
Индексы - мощный инструмент, но не панацея. Иногда запрос с индексом работает медленнее, чем без него. Почему?
Маленькая выборка - да, полное сканирование - нет
Если таблица маленькая (до нескольких тысяч строк), PostgreSQL может решить, что быстрее прочитать всё целиком, чем прыгать по индексу.
План покажет Seq Scan, и это не баг.
Индекс не помогает с функциями в WHERE
Запрос вида:
не использует индекс по created_at. Решение — переписать условие:
Селективность
Если по условию отбирается больше ~5–10% строк, индекс становится невыгодным — чтение с диска и так почти сплошное.
Статистика устарела
PostgreSQL выбирает план по статистике. Если она старая - план может быть неэффективным.
- и жизнь наладится.
Вывод: Индекс - не магическая кнопка «ускорить». Следи за планами запросов (EXPLAIN), обновляй статистику и оптимизируй условия.
Индексы - мощный инструмент, но не панацея. Иногда запрос с индексом работает медленнее, чем без него. Почему?

Если таблица маленькая (до нескольких тысяч строк), PostgreSQL может решить, что быстрее прочитать всё целиком, чем прыгать по индексу.
SQL:
EXPLAIN ANALYZE
SELECT * FROM users WHERE status = 'active';

Запрос вида:
SQL:
SELECT * FROM orders WHERE DATE(created_at) = '2025-08-12';
SQL:
WHERE created_at >= '2025-08-12' AND created_at < '2025-08-13'

Если по условию отбирается больше ~5–10% строк, индекс становится невыгодным — чтение с диска и так почти сплошное.

PostgreSQL выбирает план по статистике. Если она старая - план может быть неэффективным.
SQL:
ANALYZE table_name;
Вывод: Индекс - не магическая кнопка «ускорить». Следи за планами запросов (EXPLAIN), обновляй статистику и оптимизируй условия.