Получить доступ

Чем B-tree индекс принципиально превосходит hash-индекс?

MiddleИндексы и планы запросовPostgreSQLSQL
Ещё спрашивают так:
  • Когда использовать hash-индекс?
  • Какие типы индексов есть в PostgreSQL?
Коротко

B-дерево упорядочено — поддерживает равенство, диапазоны, сортировку и префиксы строк. Hash-индекс — только равенство. Поэтому почти всегда выбирают B-дерево.

  • B-дерево: =, <, >, BETWEEN, ORDER BY, LIKE 'abc%'
  • Hash: только =, чуть компактнее для длинных ключей
  • Специальные: GIN (массивы, JSONB, полнотекст), GiST (геометрия, диапазоны), BRIN (огромные таблицы с естественным порядком)

А ещё Hash-индексы в PostgreSQL журналируются только с версии 10

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

B-дерево хранит ключи по порядку в сбалансированном дереве страниц. Поиск значения — O(log n), диапазон — найти начало и идти по листьям, сортировка — просто читать по порядку. Подходит для чисел, строк, дат, составных ключей. Вариант по умолчанию в любой СУБД.

Hash-индекс хранит хеши ключей в корзинах. Поиск по точному значению — O(1) в среднем, но порядок теряется: никаких диапазонов, сортировки, префиксов. На практике выигрыш над B-деревом невелик (несколько уровней дерева всё равно в кэше), поэтому hash выбирают редко — для очень длинных ключей, по которым ищут только на равенство. В PostgreSQL до версии 10 hash-индексы не писались в WAL и не реплицировались.

Другие типы в PostgreSQL:

  • GIN — инвертированный индекс: элементы массивов, ключи JSONB, полнотекстовый поиск (tsvector), триграммы (pg_trgm для LIKE '%abc%');
  • GiST / SP-GiST — геометрия, диапазоны, ближайшие соседи;
  • BRIN — минимумы и максимумы по блокам; крошечный индекс для огромных таблиц, где данные физически упорядочены (журналы по времени);
  • частичные (WHERE status = 'active') и функциональные (lower(email)) индексы.

Что хотят услышать

  • Ключевое различие: упорядоченность.
  • Какие операции поддерживает каждый.
  • Почему по умолчанию B-дерево.
  • Специальные типы индексов — плюс.

Частые ошибки

  • Считать hash-индекс всегда быстрее.
  • Пытаться ускорить LIKE '%abc%' обычным B-деревом.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Поддерживает поиск по диапазону и сортировку, а не только по равенству
  • ✗Всегда быстрее для любых запросов
  • ✗Не занимает места на диске
  • ✗Гарантирует уникальность значений столбца

Что спросят дальше

  • Что такое covering index?
  • Когда индекс по равенству выгоднее B-tree?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем