Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Другие индексы: GIN, GiST, SP-GiST, BRIN и Hash
advanced_indexes

Другие индексы: GIN, GiST, SP-GiST, BRIN и Hash

Методы доступа для JSONB, массивов, диапазонов и очень больших таблиц

Открыть лабораториюv1.1.0Запускается локально из публичного репозитория

Другие индексы: GIN, GiST, SP-GiST, BRIN и Hash

B-tree подходит для равенства, диапазона и порядка, но не для каждой структуры данных. PostgreSQL предлагает другие методы доступа — способы организации индекса.

Одного названия метода недостаточно. Класс операторов (operator class) связывает тип данных и конкретные операции с этим методом. Например, два класса GIN для JSONB поддерживают разные операторы.

Краткая карта выбора

МетодКакую структуру используетТипичные задачи
Hashхеш значениятолько проверка равенства
GINмножество элементов одной строкиJSONB, массивы, текст, триграммы
GiSTобобщённое дерево областейдиапазоны, геометрия, ближайшие объекты
SP-GiSTразбиение пространстваточки, префиксные деревья, неравномерные структуры
BRINкраткие сведения о группах страницогромные таблицы в физическом порядке времени

Выбор начинается с операторов реального запроса, распределения данных и стоимости записи.

GIN: одна строка содержит много элементов

GIN хранит отдельные записи для ключей и значений внутри JSONB, массива или текста. Поэтому он хорошо ищет вхождение, но одна изменённая строка может потребовать много индексных изменений.

CREATE INDEX products_attributes_path_idx ON marketplace.products USING gin (attributes jsonb_path_ops);

jsonb_path_ops подходит для @> и части jsonpath, но не для всех операций проверки ключа. Общий jsonb_ops шире, но обычно больше.

Режим fastupdate сначала накапливает новые записи в ожидающем списке, а позже сливает их с основным индексом. Если обслуживание нерегулярно, отдельный запрос может столкнуться с дорогим слиянием. Наблюдайте не только чтение, но и запись, размер ожидающего списка и VACUUM.

GiST и SP-GiST

GiST — основа для разных деревьев, а не один конкретный алгоритм. С помощью подходящего класса он поддерживает пересечение диапазонов &&, вхождение и поиск ближайшего объекта.

SP-GiST разбивает пространство на непересекающиеся области. Он подходит некоторым точкам, префиксным деревьям и неравномерным структурам. Сам факт, что данные «пространственные», ещё не доказывает преимущество SP-GiST: сравнивайте поддерживаемые операторы и планы.

BRIN для очень больших упорядоченных таблиц

BRIN хранит краткое описание группы соседних страниц, например минимальное и максимальное время. Поэтому индекс получается очень компактным.

Он эффективен, когда значение связано с физическим порядком. В журнале, который только дописывается по occurred_at, соседние страницы содержат близкое время. Поиск одного дня отбросит большинство диапазонов.

Если строки перемешаны случайно, почти каждая группа страниц может содержать нужный диапазон, и сервер всё равно прочитает много таблицы.

Параметр pages_per_range задаёт число страниц в одной сводке: большая группа уменьшает индекс, но увеличивает ложные совпадения. Проверяйте корреляцию, Heap Blocks: lossy и фактическое чтение.

Hash

Hash-индекс поддерживает равенство. Современный PostgreSQL журналирует его в WAL. Но B-tree тоже умеет равенство и дополнительно диапазон и порядок, поэтому Hash выбирают только после измерения конкретного запроса, размера и записи.

Построение без остановки записи

CREATE INDEX CONCURRENTLY разрешает изменения таблицы, но дольше работает, ждёт старые транзакции и после ошибки может оставить недействительный индекс. Нужны ограничения времени ожидания, наблюдение через pg_stat_progress_create_index и заранее описанное удаление неудачного результата.

Практика

В лаборатории 24 вы сравните два класса GIN для JSONB и BRIN на упорядоченных и перемешанных по времени событиях.

Подробнее: типы индексов.

Проверьте свои знания

Вопросы ещё не добавлены

Вопросы для этой подтемы ещё не добавлены.

Далее: Наблюдение и обслуживание PostgreSQL