Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: index, query, planner

Почему в некоторых случаях PostgreSQL может не использовать индекс?

Вопрос проверяет понимание работы планировщика запросов PostgreSQL и причин, по которым индекс может игнорироваться.

Короткий ответ

PostgreSQL может не использовать индекс, если считает, что последовательное сканирование быстрее. Это происходит, например, при маленькой таблице, плохой селективности условия или устаревшей статистике. Планировщик оценивает стоимость различных планов и выбирает наиболее дешёвый. Поэтому наличие индекса не гарантирует его использование.

Длинный ответ

Как PostgreSQL выбирает план выполнения

Перед выполнением запроса PostgreSQL использует планировщик (query planner), который:

  1. оценивает возможные варианты выполнения

  2. рассчитывает приблизительную стоимость каждого варианта

  3. выбирает наиболее дешёвый

Индекс используется только тогда, когда его использование дешевле, чем последовательное сканирование (Seq Scan).

Основные причины, почему индекс не используется

  1. Маленький размер таблицы
    Если таблица содержит немного строк, быстрее прочитать её полностью, чем выполнять случайные чтения через индекс.

  2. Низкая селективность условия
    Если условие возвращает большую часть таблицы, использование индекса не даёт выигрыша.

Пример:

SELECT * FROM users WHERE is_active = true;

Если почти все строки is_active = true, индекс мало помогает.

  1. Устаревшая статистика
    Планировщик опирается на статистику. Если она устарела, он может ошибиться.

Решение:

ANALYZE users;
  1. Несоответствие типам или функциям

Если запрос использует выражение:

WHERE LOWER(email) = 'test@example.com'

Обычный индекс на email использоваться не будет, если нет функционального индекса.

  1. Неподходящий тип условия

Например:

  • использование LIKE '%abc'

  • неиспользуемые части составного индекса

Как проверить план

Используют:

EXPLAIN ANALYZE SELECT ...

Это показывает:

  • какой план выбран

  • использовался ли индекс

Когда это важно

Понимание поведения индексов необходимо:

  1. при оптимизации медленных запросов

  2. при проектировании схемы БД

  3. при анализе нагрузки

Вывод

PostgreSQL не обязан использовать индекс. Он выбирает план на основе стоимости, и иногда последовательное сканирование действительно быстрее. Поэтому оптимизация всегда начинается с анализа плана выполнения.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Postgres

    Postgres

Ключевые слова

#index

#query

#planner

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.