B-tree - индекс по умолчанию, поддерживает <, <=, =, >=, >,
BETWEEN, IN, IS NULL и выдаёт данные отсортированными.
Три роли страниц
- meta page (страница 0) - указатель на корень и высоту дерева;
- внутренние страницы - разделители и downlink на детей;
- листовые страницы - ключ и ссылка
ctidна строку.
Поиск: meta → корень → внутренние → лист. Увидеть руками через
pageinspect:
SELECT root, level FROM bt_metap('tickets_pkey');SELECT itemoffset, ctid, data FROM bt_page_items('tickets_pkey', 1);Почему дерево мелкое
На внутренней странице помещаются сотни разделителей, значит fanout - сотни детей. Глубина ≈ log_fanout(число строк): 3 уровня на десятки миллионов, 4 на миллиарды. Поэтому поиск по индексу - 3-4 чтения страниц, и индексный доступ дёшев при малой селективности (см. selectivity-crossover).
Сбалансированность
Все листья на одной глубине, путь от корня до любого листа одинаков - время поиска предсказуемо. Механизмы split, дедупликации и INCLUDE - в btree-internals. Тип индекса под оператор выбирают через operator-classes.