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

Ответ 18+ 🔞

А, слушай-ка, про хэш-индексы в постгресе! Ну это ж, блядь, как молоток, который забивает только один гвоздь, но зато ебёт как бог.

Представь себе, есть у тебя столбец, ну там email какой-нибудь. И тебе надо найти запись ТОЧНО по нему, чтобы ни хуя больше. Не «начинается с», не «больше-меньше», а вот это вот пиздецкое, конкретное равенство. Вот для этого эта штука и создана.

Что он умеет, этот хитрожопый?

  • Скорость, блядь, конская: В идеале находит за O(1), то есть почти мгновенно. На больших объёмах данных может B-Tree обставить, как лохушку.
  • Места жрёт поменьше: Иногда компактнее своего универсального собрата-дерева.

А где он, сука, лажает?

  • Узкий специалист, пидарас: Никаких «больше-меньше», никакого LIKE 'vasya%', никакой сортировки по нему. Только = и всё, пиздец. Хочешь что-то ещё — иди нахуй, в B-Tree.
  • Раньше был совсем конченый: До десятой версии его в WAL не писали, так что после сбоя он мог просто исчезнуть, как твоя зарплата в пятницу вечером. Но щас, с десятой версии, эту хуйню починили, можно спать спокойно.

Как его, этого урода, вызвать к жизни?

-- Вешаем хэш-индекс на почту юзеров, чтобы искать их на раз-два
CREATE INDEX idx_users_email_hash ON users USING HASH (email);

Короче, вывод, ёпта: Если у тебя колонка с кучей уникальных значений и ты с неё будешь делать ТОЛЬКО точный поиск (WHERE email = 'vasya@ebanya.ru'), то хэш — твой выбор, овердохуища быстрый. Но если хоть краем ебала думаешь про диапазоны или сортировку — даже не мучайся, бери B-Tree, он хоть и не такой шустрый в одной узкой дисциплине, зато мультитул, блядь, на все случаи жизни.