Ответ
B-дерево (B-Tree) — это сбалансированная древовидная структура данных, оптимизированная для систем, которые читают и записывают большие блоки данных (например, базы данных и файловые системы). Это самый распространенный тип индекса в реляционных СУБД (MySQL InnoDB, PostgreSQL).
Ключевые свойства B-дерева:
- Сбалансированность: Все листовые узлы находятся на одинаковой глубине, что гарантирует предсказуемую производительность операций —
O(log n). - Множество ключей в узле: Каждый внутренний узел содержит несколько ключей и ссылок на дочерние узлы, что минимизирует высоту дерева и количество обращений к диску.
- Упорядоченность: Ключи в узле отсортированы, что позволяет эффективно выполнять как точечные, так и диапазонные запросы (например,
BETWEEN,>).
Как B-дерево работает как индекс в БД:
- Корневой и промежуточные узлы хранят ключи (значения индексируемого столбца) и указатели на дочерние узлы.
- Листовые узлы содержат фактические ключи и либо ссылки на строки данных (row IDs), либо сами данные (в кластеризованных индексах).
- Поиск происходит от корня к листу, эффективно сужая область поиска на каждом уровне.
Пример структуры узла (концептуально):
// Упрощенное представление узла B-дерева степени t
class BTreeNode {
int[] keys; // Массив ключей (отсортированный)
BTreeNode[] children;// Массив ссылок на дочерние узлы
boolean isLeaf; // Флаг листового узла
int keyCount; // Текущее количество ключей в узле
}
Преимущества B-дерева для индексации:
- Эффективный поиск по диапазону: Поддерживает операции
>,<,BETWEEN. - Высокая производительность: Логарифмическая сложность для поиска, вставки и удаления.
- Автоматическая балансировка: Поддерживает оптимальную форму при модификациях.
Ограничения: Менее эффективен для очень больших значений ключей (например, длинных строк), где могут лучше подойти B+-деревья (в которых данные хранятся только в листьях).