Ответ
В PostgreSQL по умолчанию используется индекс типа B-дерево (B-tree).
Он создается автоматически в следующих случаях:
- При объявлении первичного ключа (
PRIMARY KEY). - При добавлении ограничения уникальности (
UNIQUE). - При выполнении команды
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).
Оно само, блядь, вылезает, как геморрой, в трёх случаях:
- Объявил первичный ключ (
PRIMARY KEY) — хоп, и индекс уже тут как тут, с названиемтаблица_pkey. - Нацепил ограничение уникальности (
UNIQUE) на колонку — оп, второй индекс припёрся,таблица_колонка_key. - Ну и если просто команду
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 — оно как воздух, всегда по умолчанию, чтоб ты не сдох от полного сканирования таблицы на миллион записей.