# Hash-индекс _Индексы · PostgreSQL Knowledge Base_ **TL;DR:** Hash поддерживает только оператор равенства и ищет по хешу за одно-два обращения. С PostgreSQL 10 он журналируется (WAL) и безопасен. Не умеет диапазоны, сортировку и многоколоночность - по умолчанию бери B-tree. Hash-индекс - специализация под равенство, контраст к универсальному B-tree (см. [btree-structure](/courses/postgres/kb/btree-structure.md)). ## Устройство | Страница | Роль | |---|---| | meta | число бакетов, маски | | bucket | корзина под диапазон хешей | | overflow | продолжение переполненного бакета | | bitmap | учёт свободных overflow-страниц | 4-байтный хеш ключа определяет бакет; внутри - хеш-коды и `ctid`. Число бакетов растёт линейным хешированием (постепенно, без разовой перестройки). ## История До PostgreSQL 10 hash не писался в WAL - был небезопасен после сбоя и не реплицировался. С PG10 полноценно журналируется. Старый совет «не используй hash» - про эпоху до 10. ## Чего не умеет Только `=`. Никаких диапазонов (`<`, `>`), сортировки (`ORDER BY`), многоколоночности и префиксного `LIKE 'abc%'` - порядок хеша не связан с порядком значений (см. [operator-classes](/courses/postgres/kb/operator-classes.md)). ## Когда выбрать Строго равенство по длинному ключу без потребности в порядке: hash хранит только хеш-коды и на длинных ключах компактнее B-tree. Во всех остальных случаях B-tree (см. [index-design](/courses/postgres/kb/index-design.md)). ```sql CREATE INDEX ON big USING hash (key); ``` ## Команды ```sql CREATE INDEX ON t USING hash (col); ``` Hash-индекс под оператор равенства ```sql \di+ idx_name ``` Сравнить размер hash и btree ## См. также - [B-tree: структура и спуск](/courses/postgres/kb/btree-structure.md) - [Operator classes и выбор индекса](/courses/postgres/kb/operator-classes.md) - [Проектирование индексов](/courses/postgres/kb/index-design.md)