Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Postgres: database index, query optimization, performance tuning, SQL, B-tree

Когда необходимо создавать дополнительные индексы?

Этот вопрос проверяет понимание стратегии создания индексов в базах данных для оптимизации запросов и предотвращения избыточности.

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

Дополнительные индексы создаются, когда частые запросы выполняются медленно из-за полного сканирования таблиц. Основные причины: фильтрация по неиндексированным столбцам, соединения таблиц по ключам без индексов, сортировка или группировка данных. Индексы ускоряют поиск, но замедляют операции вставки, обновления и удаления, так как индексную структуру нужно поддерживать в актуальном состоянии. Поэтому их добавляют обдуманно, анализируя рабочие нагрузки.

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

Индексы в базах данных — это структуры данных (чаще всего B-деревья), которые ускоряют извлечение строк по значениям определённых столбцов. Они работают подобно алфавитному указателю в книге, позволяя быстро найти нужную информацию, не просматривая все страницы подряд.

Когда создавать дополнительные индексы

  • Медленные запросы SELECT с WHERE: Если запросы часто фильтруют данные по конкретному столбцу (например, WHERE status = 'active'), и этот столбец не индексирован, СУБД будет выполнять полное сканирование таблицы (FULL TABLE SCAN), что ресурсоёмко для больших таблиц.
  • Соединения таблиц (JOIN): Столбцы, используемые в условиях JOIN, должны быть индексированы, особенно внешние ключи. Без индекса для каждого ряда одной таблицы будет выполняться поиск в другой, что приводит к квадратичной сложности.
  • Операции сортировки (ORDER BY) и группировки (GROUP BY): Если запрос требует сортировки по столбцу, индекс на этом столбце может позволить получить данные уже в отсортированном порядке, избегая дорогостоящей операции сортировки во время выполнения.
  • Обеспечение уникальности: Уникальные ограничения (UNIQUE CONSTRAINT) автоматически создают индекс для проверки уникальности значений.
  • Частые поиски по префиксу или диапазону: Индексы хорошо работают для поиска по диапазону (BETWEEN, >, <) и по префиксу строк.

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

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

-- Медленный запрос без индекса
SELECT * FROM orders 
WHERE customer_id = 12345 
  AND order_date >= '2024-03-01';

-- Создание составного индекса для ускорения
CREATE INDEX idx_orders_customer_date 
ON orders(customer_id, order_date);

-- После создания индекса тот же запрос будет использовать
-- индекс для быстрого поиска по customer_id и order_date.

Где применяется и ограничения

Индексы применяются в реляционных (PostgreSQL, MySQL) и многих NoSQL базах данных. Важно помнить о компромиссах:

  • Затраты на запись: Каждая операция INSERT, UPDATE или DELETE должна обновлять индексы, что добавляет накладные расходы.
  • Использование дискового пространства: Индексы занимают дополнительное место.
  • Не все запросы выигрывают: Если таблица маленькая или запросы выбирают большую часть строк (более ~15-20%), оптимизатор может проигнорировать индекс в пользу полного сканирования.

Вывод: Дополнительные индексы стоит создавать для столбцов, которые часто участвуют в условиях WHERE, JOIN, ORDER BY и GROUP BY в медленных, но критичных для производительности запросах. Решение должно приниматься после анализа планов выполнения запросов (EXPLAIN) и мониторинга реальной нагрузки.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Postgres

    Postgres

  • SQL

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

#database index

#query optimization

#performance tuning

#SQL

#B-tree

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