Что такое B-дерево (B-Tree) и как оно используется для индексации?

«Что такое B-дерево (B-Tree) и как оно используется для индексации?» — вопрос из категории Базы данных, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

B-дерево (B-Tree) — это сбалансированная древовидная структура данных, оптимизированная для систем, которые читают и записывают большие блоки данных (например, базы данных и файловые системы). Это самый распространенный тип индекса в реляционных СУБД (MySQL InnoDB, PostgreSQL).

Ключевые свойства B-дерева:

  • Сбалансированность: Все листовые узлы находятся на одинаковой глубине, что гарантирует предсказуемую производительность операций — O(log n).
  • Множество ключей в узле: Каждый внутренний узел содержит несколько ключей и ссылок на дочерние узлы, что минимизирует высоту дерева и количество обращений к диску.
  • Упорядоченность: Ключи в узле отсортированы, что позволяет эффективно выполнять как точечные, так и диапазонные запросы (например, BETWEEN, >).

Как B-дерево работает как индекс в БД:

  1. Корневой и промежуточные узлы хранят ключи (значения индексируемого столбца) и указатели на дочерние узлы.
  2. Листовые узлы содержат фактические ключи и либо ссылки на строки данных (row IDs), либо сами данные (в кластеризованных индексах).
  3. Поиск происходит от корня к листу, эффективно сужая область поиска на каждом уровне.

Пример структуры узла (концептуально):

// Упрощенное представление узла B-дерева степени t
class BTreeNode {
    int[] keys;          // Массив ключей (отсортированный)
    BTreeNode[] children;// Массив ссылок на дочерние узлы
    boolean isLeaf;      // Флаг листового узла
    int keyCount;        // Текущее количество ключей в узле
}

Преимущества B-дерева для индексации:

  • Эффективный поиск по диапазону: Поддерживает операции >, <, BETWEEN.
  • Высокая производительность: Логарифмическая сложность для поиска, вставки и удаления.
  • Автоматическая балансировка: Поддерживает оптимальную форму при модификациях.

Ограничения: Менее эффективен для очень больших значений ключей (например, длинных строк), где могут лучше подойти B+-деревья (в которых данные хранятся только в листьях).