Почему индекс в PostgreSQL не всегда спасает?

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,994
Реакции
1,564
Credits
35,632
Почему индекс в PostgreSQL не всегда спасает?

Индексы - мощный инструмент, но не панацея. Иногда запрос с индексом работает медленнее, чем без него. Почему?
1️⃣ Маленькая выборка - да, полное сканирование - нет
Если таблица маленькая (до нескольких тысяч строк), PostgreSQL может решить, что быстрее прочитать всё целиком, чем прыгать по индексу.
SQL:
EXPLAIN ANALYZE
SELECT * FROM users WHERE status = 'active';
План покажет Seq Scan, и это не баг.

2️⃣ Индекс не помогает с функциями в WHERE
Запрос вида:
SQL:
SELECT * FROM orders WHERE DATE(created_at) = '2025-08-12';
не использует индекс по created_at. Решение — переписать условие:
SQL:
WHERE created_at >= '2025-08-12' AND created_at < '2025-08-13'

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

4️⃣ Статистика устарела
PostgreSQL выбирает план по статистике. Если она старая - план может быть неэффективным.
SQL:
ANALYZE table_name;
- и жизнь наладится.

Вывод: Индекс - не магическая кнопка «ускорить». Следи за планами запросов (EXPLAIN), обновляй статистику и оптимизируй условия.