← Назад к вопросам

В чем разница между кластерных и некластерных индексов в PostgreSQL?

1.7 Middle🔥 61 комментариев
#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между кластерными и некластерными индексами в PostgreSQL

PostgreSQL использует только один тип индексов — некластерные. Концепция кластерных индексов, знакомая из SQL Server, в PostgreSQL отсутствует. Однако есть похожая функция — CLUSTER, которая физически переупорядочивает данные.

Некластерные индексы в PostgreSQL

В PostgreSQL все индексы по умолчанию являются некластерными. Это означает, что индекс хранит указатели (TID — tuple identifier) на физические строки в таблице, но не определяет физический порядок этих строк.

CREATE INDEX idx_users_email ON users(email);

Когда вы ищете пользователя по email, PostgreSQL использует индекс для быстрого поиска TID строки, а затем извлекает данные из основной таблицы.

CLUSTER — псевдо-кластерный индекс

PostgreSQL предоставляет команду CLUSTER, которая физически переупорядочивает таблицу в порядке индекса. Это достигает эффекта кластерного индекса, но это одноразовая операция, не динамическая.

CREATE INDEX idx_users_email ON users(email);
CLUSTER users USING idx_users_email;

Ключевые отличия

ХарактеристикаНекластерныйCLUSTER
Количество на таблицуНеограниченно1
Физический порядокНе влияетФизически переупорядочивает
ОбновлениеАвтоматическоеТребует повторного CLUSTER
Производительность поискаХорошаЛучше для диапазонов

Когда использовать CLUSTER

  • Таблицы с редкими изменениями
  • Очень частые диапазонные запросы
  • Оптимизация под последовательное сканирование
CREATE INDEX idx_logs_date ON logs(created_at);
CLUSTER logs USING idx_logs_date;
SELECT * FROM logs WHERE created_at >= '2025-01-01' ORDER BY created_at;

Когда не использовать

  • Часто обновляемые таблицы
  • Несколько часто используемых индексов
  • Маленькие таблицы

Сравнение с SQL Server

В SQL Server кластерные индексы постоянные и динамические. В PostgreSQL это одноразовая операция, требующая явного вызова CLUSTER.

Производительность

Без CLUSTER: случайный доступ к строкам (медленно). С CLUSTER: последовательный доступ (2-10x быстрее на больших таблицах).

Заключение

PostgreSQL не имеет встроенных кластерных индексов. Используются некластерные индексы для поиска и команда CLUSTER для физической переупорядочивания таблицы по индексу (одноразовая операция).