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

Ответ

В PostgreSQL по умолчанию используется индекс типа B-дерево (B-tree).

Он создается автоматически в следующих случаях:

  1. При объявлении первичного ключа (PRIMARY KEY).
  2. При добавлении ограничения уникальности (UNIQUE).
  3. При выполнении команды CREATE INDEX без явного указания типа индекса.

Пример

CREATE TABLE employees (
    id SERIAL PRIMARY KEY, -- автоматически создаст B-tree индекс "employees_pkey"
    email VARCHAR(255) UNIQUE, -- автоматически создаст B-tree индекс "employees_email_key"
    department_id INT
);

-- Явное создание B-tree индекса (указывать USING btree не обязательно)
CREATE INDEX idx_department_id ON employees(department_id);

Почему B-tree?

B-дерево является наиболее универсальным и сбалансированным типом индекса. Он эффективно обрабатывает большинство операций сравнения: =, >, <, >=, <=, BETWEEN, а также LIKE для поиска по префиксу (например, 'text%').

Для более специфических задач, таких как полнотекстовый поиск или работа с геометрическими данными, используются другие типы индексов (GIN, GiST, Hash), которые нужно указывать явно.

Ответ 18+ 🔞

А, слушай, про индексы в Постгресе! Вот реально, народ часто нихуя не понимает, а там всё просто, как три копейки. По умолчанию там везде торчит один и тот же тип — B-дерево (B-tree).

Оно само, блядь, вылезает, как геморрой, в трёх случаях:

  1. Объявил первичный ключ (PRIMARY KEY) — хоп, и индекс уже тут как тут, с названием таблица_pkey.
  2. Нацепил ограничение уникальности (UNIQUE) на колонку — оп, второй индекс припёрся, таблица_колонка_key.
  3. Ну и если просто команду CREATE INDEX швырнул, не заморачиваясь — он, ясное дело, тоже B-tree создаст, потому что он дефолтный, универсальный солдат, ёпта.

Смотри, как это выглядит вживую

CREATE TABLE employees (
    id SERIAL PRIMARY KEY, -- тут автоматом B-tree индекс "employees_pkey" впендюрится
    email VARCHAR(255) UNIQUE, -- и тут тоже, "employees_email_key"
    department_id INT
);

-- А вот явное создание такого же индекса (писать USING btree вообще не обязательно, он и так умный)
CREATE INDEX idx_department_id ON employees(department_id);

А нахуя именно B-tree, спросишь?

Да потому что это, блядь, швейцарский нож среди индексов! Оно жуёт практически любые операции сравнения: равно, больше, меньше, между, да даже LIKE 'начало%' потянет. Универсал, одним словом.

Но если тебе надо искать текст по всему содержимому или с геоданными возиться — тогда уже надо другие, спец.индексы (GIN, GiST) вручную вызывать, они сами не придут. А B-tree — оно как воздух, всегда по умолчанию, чтоб ты не сдох от полного сканирования таблицы на миллион записей.