Какой тип индекса используется по умолчанию в PostgreSQL?

Ответ

В PostgreSQL по умолчанию создаётся индекс типа B-tree (B-дерево), если в команде CREATE INDEX не указан другой метод доступа.

Почему B-tree? Это сбалансированное дерево, оптимальное для широкого спектра операций:

  • Проверка равенства (=)
  • Диапазонные запросы (>, <, BETWEEN)
  • Сортировка (ORDER BY)
  • Поиск по префиксу (LIKE 'abc%')
  • Поддержка уникальных ограничений и NULL значений.

Синтаксис:

-- Создаст B-tree индекс по умолчанию
CREATE INDEX idx_user_email ON users(email);

-- Явное указание типа B-tree (эквивалентно строке выше)
CREATE INDEX idx_user_email ON users USING btree (email);

Альтернативные типы индексов (требуют явного указания):

  • HASH — для операций строгого равенства.
  • GIN — для полнотекстового поиска и JSONB.
  • GiST/SP-GiST — для геоданных и сложных типов.
  • BRIN — для очень больших таблиц с коррелированными данными.

Ответ 18+ 🔞

А, слушай, вот тебе наглядный пример, как всё просто, а потом оказывается, что под капотом — целый ёперный театр. Берёшь ты команду CREATE INDEX в Постгресе и думаешь: "Ну, создам я индекс, и всё". А он тебе, сука, по умолчанию B-tree лепит! Блядь, как будто других типов не существует!

Ну, а че? B-tree — это как универсальный солдат, швейцарский нож, блядь. Он для всего сгодится: и если тебе надо найти что-то конкретное (WHERE email = 'вася@пупкин.ру'), и если выбрать всё "от сих до сих" (WHERE age BETWEEN 18 AND 25), и даже если отсортировать по полю. В общем, палочка-выручалочка, ёпта. Поэтому его и выбрали дефолтным — чтобы распиздяй, который в индексах не шарит, хотя бы не накосячил с самого начала.

Вот смотри, пишешь ты:

CREATE INDEX idx_user_email ON users(email);

И думаешь: "Всё, я молодец". А под капотом-то происходит магия: Постгрес сам, как хитрая жопа, дописывает туда USING btree. Полная запись, которую он выполняет, выглядит так:

CREATE INDEX idx_user_email ON users USING btree (email);

Одно и то же, блядь! Просто в первом случае он за тебя думает. Ну, спасибо, конечно, но иногда это доверия ебать ноль вызывает.

А теперь главное, блядь, не обосраться! Потому что если тебе нужна не эта универсальная дубина, а что-то точечное — надо явно указать. А то будешь потом охуевать, почему хеш-индекс не работает для LIKE.

Вот тебе краткий разбор полётов, что ещё есть в арсенале, кроме этого вездесущего B-tree:

  • HASH — Это для тупых, но быстрых проверок на равенство. Только =. Спросил — получил. Всё. Для диапазонов — нихуя не годится. Как молоток: гвоздь забить — идеально, шуруп закрутить — пиздец.
  • GIN — Вот это уже для интеллектуалов. Полнотекстовый поиск, JSONB-поля, массивы. Когда тебе надо искать внутри данных, а не по ним целиком. Мощная штука, но и кушает много.
  • GiST/SP-GiST — Для всяких гео-заморочек, поиска по интервалам, по сложным типам данных. Если работаешь с координатами или чем-то таким — тебе сюда. Иначе даже не лезь, а то запутаешься, как мартышлюшка.
  • BRIN — А это для совсем уж здоровых дядек, у которых таблицы размером с овердохуища. Он не по каждому значению строит индекс, а по блокам. Если данные в таблице лежат упорядоченно (например, по дате), то он может быть охуенно эффективным и маленьким. Но если данные вразнобой — это просто выброшенное время и место.

Короче, мой совет: если не знаешь, что выбрать — оставь B-tree, не прогадаешь. Но если уже упёрся в конкретную, узкую задачу — читай документацию и выбирай специализированный инструмент. А то будет как с Герасимом и Муму — возьмёшь и утопишь производительность в пизду, потому что не подумал.