TGViewer
Женя Янченко Женя Янченко @jane_yanchenko · 5.51K subscribers
Post #38 1.89K
B-деревья

B-деревья — это стандартная реализация индексов в реляционных БД.

В ранее рассмотренных LSM-деревьях происходит только дописывание (и удаление устаревших) файлов, но не изменение существующих файлов. В отличие от них, B-деревья используют обновление на месте. Диск рассматривается как набор страниц заданного размера (обычно 4 КБ), допускающих перезапись. Все страницы имеют свой адрес/местоположение, благодаря чему одни страницы могут ссылаться на другие и собираться в дерево.

Поиск ключа начинается со страницы-корня. Она содержит несколько ключей и ссылок на дочерние страницы.
Например, мы ищем ключ 243. Переходим по ссылке на страницу диапазона 200—300. На этой странице вновь переходим по ссылке на страницу диапазона 230—250 и так добираемся до страницы, содержащей отдельные ключи. Это страница-лист. Она содержит или сами значения для ключей или ссылки на страницы, где можно найти эти значения.

Количество ссылок на дочерние страницы на одной странице B-дерева называется коэффициентом ветвления (branching factor). В примере на рисунке он равен 6, а практике обычно равен нескольким сотням.

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

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

Такой подход гарантирует, что дерево останется сбалансированным, то есть глубина B-дерева с n ключами будет равна O(log n). Большинству БД хватает деревьев глубиной 3 или 4 уровня (четырехуровневое дерево страниц по 4 КБ с коэффициентом ветвления в 500 может хранить до 256 ТБ информации).

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

Чтобы сделать БД отказоустойчивой используют специальный журнал упреждающей записи (write-ahead log — WAL, redo log). Это файл, в который все модификации B-деревьев записываются еще до того, как применяться к самим страницам дерева. Когда база возвращается в норму после сбоя, этот журнал используется для восстановления B-дерева в согласованное состояние.

#кабанчик #сисдиз
  • 👍 10
  • 🔥 5
  • ❤ 1
More from @jane_yanchenko
  1. Sep 25, 2026В прошлой жизни, когда я была менеджером проектов, одним из первых мест работы у меня был…
  2. Sep 23, 2026Куда пропало обращение - развязка В прошлом посте у нас загадочно пропало обращение 58122.…
  3. Sep 23, 2026Куда пропало обращение Однажды от руководителя техподдержки пришло письмо, суть которого с…
  4. Sep 21, 2026🔗 Подборка постов про Кафку Как обещала на стриме, собрала посты про Кафку в удобное огла…
  5. Sep 21, 2026🎞 Готова запись стрима про Кафку: https://youtu.be/2aRKsD-MWDA Большое спасибо всем, кто…
  6. Sep 16, 2026Сегодня стрим по Кафке в 19:00 Планируем не в формате доклада, а в формате вопрос-ответ, ч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →