#btree-structure
Как устроен B-tree и почему поиск в нём логарифмический?
Что отвечать
B-tree - сбалансированное дерево из страниц. Корень и внутренние страницы хранят разделители: ключ плюс ссылку на дочернюю страницу. Листья хранят ключи в отсортированном порядке и ссылки на строки кучи (`ctid`). Поиск идёт от корня вниз: на каждом уровне по разделителям выбираем нужную ветку, за несколько шагов (высота дерева) приходим в лист. Высота растёт логарифмом от числа строк, поэтому даже на миллиардах записей это единицы обращений к страницам. Листья связаны ссылками влево-вправо, что даёт быстрый диапазонный обход и `ORDER BY` без отдельной сортировки.
Что хотят услышать
Senior должен: - описать уровни: корень, внутренние страницы с разделителями, листья с ключами и ctid - связать логарифмическую сложность с высотой дерева и числом обращений к страницам - объяснить, почему B-tree хорош для диапазонов и сортировки: листья отсортированы и связаны - упомянуть оптимизации: дедупликация одинаковых ключей и усечение суффикса разделителей экономят место
Подводные камни
- ✗ Думать, что листья B-tree хранят сами строки - они хранят ключ и `ctid`, а строка в куче
- ✗ Считать, что B-tree эффективен для `LIKE '%x'` или неравенства по выражению - порядок там не помогает
- ✗ Забывать, что высота мала: даже на больших таблицах это несколько уровней, а не десятки
Follow-up
- ? Почему B-tree даёт `ORDER BY` без отдельной сортировки?
- ? Что хранится в листе B-tree?
- ? Что такое дедупликация в B-tree и зачем она?
Глубина в базе знаний