Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: database index, query performance, EXPLAIN, slow query, index usage

Как определить, что индекс не используется?

Этот вопрос проверяет умение анализировать производительность запросов и выявлять неиспользуемые индексы в базах данных, что необходимо для оптимизации и поддержания эффективности системы.

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

Чтобы определить, что индекс не используется, можно использовать команду EXPLAIN перед запросом. В её выводе проверьте столбец 'key' — если он пуст или показывает NULL, значит индекс не задействован. Также можно анализировать медленные запросы через лог или мониторинговые инструменты, которые показывают полные сканирования таблиц (full table scans). Ещё один способ — запросить статистику использования индексов из системных таблиц СУБД, например, в PostgreSQL это представление pg_stat_user_indexes.

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

Индексы создаются для ускорения поиска данных, но иногда запросы обходят их, что приводит к медленному выполнению. Определение неиспользуемых индексов — ключевой шаг в оптимизации базы данных, так как лишние индексы замедляют операции вставки и обновления.

Основные методы проверки

Вот несколько практических подходов:

  • Использование EXPLAIN: В большинстве СУБД команда EXPLAIN показывает план выполнения запроса. Если в плане указано 'Seq Scan' (последовательное сканирование) вместо 'Index Scan', индекс, вероятно, не используется. Например, в PostgreSQL:
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

В выводе ищите строку с 'Index Scan'. Если её нет, а есть 'Seq Scan', индекс не задействован.

  • Анализ статистики использования: СУБД часто ведут статистику по индексам. В PostgreSQL можно запросить:
SELECT schemaname, tablename, indexname, idx_scan FROM pg_stat_user_indexes WHERE idx_scan = 0;

Это покажет индексы, которые никогда не использовались для сканирования (idx_scan = 0).

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

Даже если индекс существует, запрос может его игнорировать по нескольким причинам:

  • Условие WHERE не соответствует столбцам индекса.
  • Типы данных в условии не совпадают (например, сравнение строк без учёта регистра).
  • Таблица слишком мала, и СУБД решает, что полное сканирование быстрее.
  • Индекс не селективен (например, индекс по столбцу с двумя значениями).

Практический пример

Предположим, у нас есть таблица 'orders' с индексом на 'customer_id'. Запрос ищет заказы по дате:

-- Индекс на customer_id не поможет
EXPLAIN SELECT * FROM orders WHERE order_date > '2023-01-01';

EXPLAIN покажет 'Seq Scan', так как условие не затрагивает индексированный столбец. Чтобы это исправить, может потребоваться создать индекс на 'order_date'.

Вывод: Проверяйте неиспользуемые индексы регулярно, особенно в высоконагруженных системах, чтобы удалять лишние и создавать недостающие, балансируя между скоростью чтения и затратами на запись.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Postgres

    Postgres

  • SQL

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

#database index

#query performance

#EXPLAIN

#slow query

#index usage

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