Для чего и когда следует использовать хэш-индекс в PostgreSQL?

Ответ

Хэш-индекс в 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 является более универсальным и предпочтительным выбором.