Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

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

Что такое индексы и зачем они нужны?

Вопрос проверяет понимание индексов в базах данных, их назначения для ускорения поиска и сортировки данных.

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

Индекс в базе данных — это специальная структура данных, которая ускоряет операции поиска и сортировки. Он работает как алфавитный указатель в книге, позволяя быстро найти нужные строки, не перебирая всю таблицу. Индексы обычно создаются на столбцы, часто используемые в условиях WHERE, JOIN или ORDER BY. Они ускоряют чтение данных, но замедляют операции вставки, обновления и удаления, так как индекс тоже нужно поддерживать в актуальном состоянии.

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

Индекс в реляционной базе данных — это вспомогательная структура, которая хранит отсортированные значения одного или нескольких столбцов таблицы вместе со ссылками на соответствующие строки. Основная цель — резко сократить количество данных, которые СУБД должна просканировать для выполнения запроса.

Как работает индекс

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

Типы и применение

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

  • Ускорения поиска по условию WHERE.
  • Оптимизации соединений JOIN.
  • Ускорения сортировки (ORDER BY) и группировки (GROUP BY).
  • Обеспечения уникальности (уникальный индекс).

Пример создания и использования

-- Создание таблицы пользователей
CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) NOT NULL,
    last_name VARCHAR(50),
    signup_date DATE
);

-- Создание индекса по столбцу email для быстрого поиска по почте
CREATE INDEX idx_users_email ON users(email);

-- Создание составного индекса по фамилии и дате регистрации
CREATE INDEX idx_name_date ON users(last_name, signup_date);

-- Запрос, который может использовать индекс
SELECT * FROM users WHERE last_name = 'Иванов' AND signup_date > '2023-01-01';
-- СУБД, скорее всего, использует составной индекс idx_name_date,
-- что будет намного быстрее, чем сканирование всей таблицы.

Компромиссы

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

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    3

Навыки

  • Postgres

    Postgres

  • SQL

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

#database index

#SQL

#query performance

#B-tree

#primary key

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