Ответ
Хэш-индекс в PostgreSQL предназначен для очень быстрого поиска данных по точному совпадению (оператор =
). Он работает, создавая хэш-таблицу, где ключом является хэш значения из индексируемого столбца.
Ключевые особенности
Преимущества:
- Высокая скорость: Поиск по точному совпадению в среднем выполняется за константное время O(1), что может быть быстрее, чем у B-Tree на больших таблицах.
- Компактность: Может занимать меньше места на диске по сравнению с B-Tree для некоторых типов данных.
Недостатки:
- Ограниченность запросов: Не поддерживает операции сравнения диапазонов (
<
,>
,BETWEEN
), сортировку (ORDER BY
) или поиск по префиксу (LIKE 'prefix%'
). Работает только для оператора равенства. - Проблемы с репликацией (в старых версиях): До PostgreSQL 10 хэш-индексы не логировались в WAL (Write-Ahead Log), что делало их небезопасными для репликации. Эта проблема решена начиная с PG 10.
Пример создания:
-- Создание хэш-индекса для колонки email в таблице users
CREATE INDEX idx_users_email_hash ON users USING HASH (email);
Итог
Используйте хэш-индекс, когда вам нужны только запросы на точное равенство для колонки с высокой кардинальностью (много уникальных значений), и вы не планируете использовать эту колонку для сортировки или диапазонных запросов. В большинстве других случаев B-Tree является более универсальным и предпочтительным выбором.