linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Индексы/hash-index

kb/indexes ── Индексы ── intermediate

Hash-индекс

Hash поддерживает только оператор равенства и ищет по хешу за одно-два обращения. С PostgreSQL 10 он журналируется (WAL) и безопасен. Не умеет диапазоны, сортировку и многоколоночность - по умолчанию бери B-tree.

view as markdownaka: hash, hash-vs-btree

Hash-индекс - специализация под равенство, контраст к универсальному B-tree (см. btree-structure).

Устройство

СтраницаРоль
metaчисло бакетов, маски
bucketкорзина под диапазон хешей
overflowпродолжение переполненного бакета
bitmapучёт свободных overflow-страниц

4-байтный хеш ключа определяет бакет; внутри - хеш-коды и ctid. Число бакетов растёт линейным хешированием (постепенно, без разовой перестройки).

История

До PostgreSQL 10 hash не писался в WAL - был небезопасен после сбоя и не реплицировался. С PG10 полноценно журналируется. Старый совет «не используй hash» - про эпоху до 10.

Чего не умеет

Только =. Никаких диапазонов (<, >), сортировки (ORDER BY), многоколоночности и префиксного LIKE 'abc%' - порядок хеша не связан с порядком значений (см. operator-classes).

Когда выбрать

Строго равенство по длинному ключу без потребности в порядке: hash хранит только хеш-коды и на длинных ключах компактнее B-tree. Во всех остальных случаях B-tree (см. index-design).

sql
CREATE INDEX ON big USING hash (key);

§ команды

bash
CREATE INDEX ON t USING hash (col);

Hash-индекс под оператор равенства

bash
\di+ idx_name

Сравнить размер hash и btree

§ см. также

  • btree-structureB-tree: структура и спускB-tree - сбалансированное дерево из 8-КБ страниц: meta page указывает на корень, внутренние страницы хранят разделители и downlink, листья - ключ и ctid. Большой fanout даёт 3-4 уровня на миллиарды строк.
  • operator-classesOperator classes и выбор индексаИндекс работает не «на колонке», а для конкретных операторов над ней. Связь тип+оператор+метод доступа задаёт operator class. Через каталог pg_amop можно узнать, какой AM поддерживает оператор: @> знают gin и gist, не btree.
  • index-designПроектирование индексовИндекс - отсортированный список. Составной (a,b,c) работает по префиксу слева направо, не по средней колонке. Покрывающие (INCLUDE), частичные (WHERE) и по выражению сужают работу; лишние индексы - налог на запись.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки