0Pricing
SQL Interview Prep · Урок

Индексы B-дерева и их преимущества

Что на самом деле хранит индекс и какие операции он ускоряет

«Индексы B-дерева и их преимущества» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.

Зачем интервьюеры спрашивают об индексах

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

На этом уроке Вы сформируете точную мысленную модель B-дерева: что оно хранит, какие операции ускоряет и как рассказывать о нём так, как это сделал бы опытный инженер.

Какую проблему решает индекс

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

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

-- No index: the engine reads ALL rows to find this one
SELECT * FROM users WHERE email = 'ada@example.com';

Что на самом деле хранит B-дерево

Индексом по умолчанию в PostgreSQL, MySQL, сервере SQL и большинстве движков служит B-дерево (сбалансированное дерево). Оно хранит значения индексируемого столбца в отсортированном порядке, организованными в неглубокое дерево страниц.

  • Каждый листовой узел содержит ключи индекса и указатель на фактическую строку таблицы.
  • Дерево остаётся сбалансированным, поэтому любой поиск затрагивает лишь несколько страниц независимо от размера таблицы.

Поиск проходит от корня к листу примерно за log(N) шагов, вместо того чтобы просматривать все N строк.

Создание первого индекса

Индекс B-дерева создаётся с помощью CREATE INDEX. Называйте его понятно, чтобы проверяющий сразу видел таблицу и столбцы.

После создания этого индекса запрос с фильтрацией по email сможет найти подходящую строку за несколько чтений страниц вместо полного сканирования.

CREATE INDEX idx_users_email ON users (email);

-- Now this lookup uses the index instead of scanning
SELECT * FROM users WHERE email = 'ada@example.com';

Операции, которые ускоряет B-дерево

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

  • Равенство: WHERE email = ?
  • Диапазон: WHERE age > 30, BETWEEN, <, >=
  • Сопоставление по префиксу: WHERE name LIKE 'Ada%' (но NOT '%da')
  • ORDER BY по индексируемому столбцу, что позволяет избежать сортировки
  • MIN/MAX, поскольку они находятся на концах отсортированной структуры

Разбор примера: запрос по диапазону

Рассмотрим таблицу заказов с миллионами строк. Запрос для отчёта выбирает недавние заказы. При наличии индекса по created_at движок переходит к началу диапазона в отсортированном индексе и движется вперёд только настолько, насколько необходимо.

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

CREATE INDEX idx_orders_created_at ON orders (created_at);

SELECT order_id, total
FROM orders
WHERE created_at >= '2026-01-01'
  AND created_at <  '2026-02-01';

Индексы помогают и при сортировке

Часто упускают из виду важный момент: поскольку индекс уже отсортирован, движок может возвращать строки в порядке индекса и пропускать отдельный этап сортировки. Это важно для ORDER BY и особенно для постраничной выдачи первых N результатов.

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

-- Index on created_at lets this avoid a sort and stop after 10 rows
SELECT order_id, total
FROM orders
ORDER BY created_at DESC
LIMIT 10;

Скрытая стоимость: извлечение из кучи

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

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

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

Никогда не утверждайте, что индекс используется, не подтвердив это с помощью EXPLAIN. На собеседовании рассказ о плане показывает настоящее понимание темы.

  • Seq Scan означает, что индекс NOT использован.
  • Index Scan или Index Seek означает, что индекс использован.

Если Вы добавили индекс, но по-прежнему видите последовательное сканирование, значит, планировщик решил, что сканирование дешевле — часто потому, что запрос выбирает слишком большую долю таблицы.

EXPLAIN
SELECT * FROM users WHERE email = 'ada@example.com';
-- Look for: Index Scan using idx_users_email

Первичные ключи уже проиндексированы

Распространённый подвох на собеседовании: объявление ограничения PRIMARY KEY или UNIQUE автоматически создаёт поддерживающий индекс B-дерева. Вам не нужно и не следует добавлять второй индекс для того же столбца.

Поэтому соединения и поиск по первичным ключам уже выполняются быстро, а вопрос «нужно ли индексировать столбец идентификатора?» обычно является ловушкой: всё уже сделано за Вас.

-- This already builds a unique B-Tree index on (id)
CREATE TABLE users (
  id    BIGINT PRIMARY KEY,
  email TEXT UNIQUE
);

Как сформулировать ответ на собеседовании

Объедините всё одной чёткой фразой, с которой интервьюер сможет согласиться:

«Индекс B-дерева — это отсортированная сбалансированная структура, которая позволяет движку находить строки примерно за log(N) чтений страниц вместо сканирования всей таблицы. Он ускоряет операции равенства, диапазона, префикса и ORDER BY для индексируемых столбцов, но каждое совпадение по-прежнему требует извлечения из кучи для неиндексируемых столбцов».

Затем подтвердите это с помощью EXPLAIN. Именно сочетание модели и подтверждения приносит баллы.

Быстрая проверка

Проверьте свою мысленную модель операций, которые ускоряет индекс B-дерева.

Итоги: индексы B-дерева

Главные выводы, которые пригодятся на следующем уроке:

  • B-дерево хранит индексируемые значения в отсортированном виде в сбалансированном дереве, обеспечивая поиск за log(N) шагов.
  • Оно ускоряет операции равенства, диапазона, префикса (с начальным) LIKE, ORDER BY и MIN/MAX.
  • Для каждого совпадения по-прежнему требуется извлечение из кучи столбцов, отсутствующих в индексе.
  • Обёртывание столбца в функцию или использование начального подстановочного символа отключает индекс.
  • Всегда проверяйте результат с помощью EXPLAIN; ограничения PRIMARY KEY и UNIQUE индексируются автоматически.

Далее: как упорядочивать столбцы, когда один индекс охватывает сразу несколько из них.

Часто задаваемые вопросы

Урок «Индексы B-дерева и их преимущества» бесплатный?

Да — полный текст урока «Индексы B-дерева и их преимущества» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Индексы B-дерева и их преимущества»?

Что на самом деле хранит индекс и какие операции он ускоряет Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Interview Prep?

Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Индексы B-дерева и их преимущества»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Interview Prep?

Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Индексы B-дерева и их преимущества
  2. Порядок столбцов составного индекса
  3. Покрывающие индексы и индексное сканирование
  4. Когда индексы вредят: записи и избирательность
← Назад к SQL Interview Prep