Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Postgres: b-tree, index

Как B-tree индекс позволяет выполнять операции больше/меньше/равно — механизм поиска и извлечения диапазона значений?

Этот вопрос объясняет механизм работы B-tree индексов для поддержки операций сравнения и диапазонных запросов.

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

B-tree индекс организует данные в сбалансированное дерево, где каждый узел содержит отсортированные ключи и указатели на дочерние узлы. Для операций "равно" индекс выполняет бинарный поиск от корня к листьям. Для операций "больше/меньше" и диапазонов индекс находит начальную точку диапазона и затем последовательно читает листовые узлы в отсортированном порядке. Это позволяет эффективно находить все значения в заданном диапазоне без полного сканирования таблицы.

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

B-tree (Balanced Tree) — это структура данных, которая обеспечивает эффективный поиск, вставку и удаление элементов, а также поддержку диапазонных запросов.

Структура B-tree индекса:

  1. Узлы дерева:

    • Корневой узел (root)

    • Внутренние узлы (internal nodes)

    • Листовые узлы (leaf nodes)

  2. Организация данных:

    • Ключи в узлах отсортированы

    • Каждый узел содержит несколько ключей и указателей

    • Все листовые узлы находятся на одном уровне

Механизм поиска:

  1. Операция "равно" (=):

    • Начинается с корневого узла

    • Бинарный поиск в текущем узле

    • Переход к соответствующему дочернему узлу

    • Повтор до достижения листового узла

  2. Операции "больше/меньше" (>, <, >=, <=):

    • Поиск начального значения диапазона

    • Последовательное чтение листовых узлов

    • Останов при выходе за границы диапазона

  3. Диапазонные запросы (BETWEEN):

    • Нахождение начальной точки диапазона

    • Чтение вперед до конечной точки

    • Использование связей между листовыми узлами

Пример работы диапазонного запроса:

-- Запрос: найти сотрудников с зарплатой от 3000 до 5000
SELECT * FROM employees WHERE salary BETWEEN 3000 AND 5000;

Процесс выполнения:

  1. Поиск значения 3000 в B-tree индексе по salary

  2. Нахождение первого подходящего значения

  3. Последовательное чтение листовых узлов до значения 5000

  4. Возврат всех найденных записей

Визуализация B-tree:

        [4000]
       /     \
 [2000,3000] [5000,6000]
 /    |    \   /    |    \
[1..][2..][3..][4..][5..][6..]  <- листовые узлы

Преимущества для диапазонных запросов:

  • Отсортированность данных в листовых узлах

  • Минимальное количество обращений к диску

  • Эффективное использование последовательного чтения

Ограничения:

  • Эффективен только для префиксов составных индексов

  • Требует поддержания сбалансированности

  • Занимает дополнительное место

Уровень

  • Рейтинг:

    3

  • Сложность:

    7

Навыки

  • Postgres

    Postgres

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

#b-tree

#index

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