PassFront
  1. PassFront
  2. База знаний
  3. Деревья и кучи

Что такое B-дерево и почему оно используется в базах данных и файловых системах?

Деревья и кучи

B-дерево — сбалансированное дерево поиска, где в узле хранятся сотни ключей, а все листья на одной глубине; узел подгоняют под размер страницы диска, и поиск среди миллиардов записей укладывается в 3–4 чтения страниц.

Устройство

  • Узел порядка m содержит до m−1 ключей и до m детей; каждый узел, кроме корня, заполнен хотя бы наполовину.
  • Высота ≈ log_m(n): при ветвлении 500 четыре уровня вмещают больше 60 млрд ключей.
  • Вставка: если лист полон, он делится пополам, средний ключ поднимается в родителя; дерево растёт вверх через разделение корня, поэтому остаётся идеально сбалансированным.

B+-дерево — то, что в реальных системах

  • Данные или ссылки на строки лежат только в листьях, внутренние узлы — лишь разделители, поэтому ветвление ещё выше.
  • Листья связаны в список: диапазонный запрос WHERE ts BETWEEN … — спуск к началу диапазона и последовательное чтение.
  • InnoDB хранит таблицу как кластерный индекс B+-дерева на страницах по 16 КБ, PostgreSQL строит btree-индексы на страницах по 8 КБ.
  • Файловые системы: Btrfs, XFS, NTFS, APFS — B-деревья для каталогов, экстентов и метаданных.

Компромиссы

  • Отлично для чтения и диапазонов, но случайные вставки вызывают разделения страниц и запись в произвольные места.
  • Под интенсивную запись выбирают LSM-деревья (RocksDB, Cassandra): последовательная запись ценой фоновой компакции.

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

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

Другие вопросы раздела