linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Индексы/gin-index

kb/indexes ── Индексы ── intermediate

GIN: инвертированный индекс

GIN - инвертированный индекс для данных, где у строки много элементов: массивы, JSONB, полнотекст. Хранит «элемент → posting list из ctid». Быстр на чтение, дорог на запись; B-tree бессилен против LIKE '%x%', GIN решает.

view as markdownaka: gin, full-text-index, jsonb-index

Когда у строки много индексируемых значений (массив тегов, документ, текст), нужен обратный взгляд: «элемент → строки, где он встречается».

Структура

Два уровня: entry tree (B-tree уникальных ключей) и posting lists (отсортированные ctid под каждым ключом). Большой posting list становится posting tree.

рейс → [r1,r7,r9]   багаж → [r2,r7,r9]

Запрос по нескольким ключам - пересечение posting lists.

Полнотекст: где B-tree бессилен

LIKE '%x%' (подстрока без известного начала) B-tree не ускоряет - только Seq Scan. GIN по tsvector с оператором @@ решает:

sql
CREATE INDEX ON docs USING gin (to_tsvector('simple', body));

JSONB

sql
CREATE INDEX ON doc USING gin (body);            -- @>, ?, ?|
CREATE INDEX ON doc USING gin (body jsonb_path_ops);  -- компактнее, в основном @>

Выбор opclass - универсальность против размера (см. operator-classes).

fastupdate и цена записи

Новые записи копятся в pending list и переносятся пачкой при VACUUM (fastupdate) - быстрые вставки ценой просмотра pending list при поиске. GIN дорог на запись (строка со многими элементами = много записей индекса), поэтому уместен там, где читают чаще, чем пишут. Для массивов

  • операторы @>, <@, &&. Геометрия - в gist-spgist.

§ команды

bash
CREATE INDEX ON t USING gin (to_tsvector('simple', body));

GIN для полнотекста, поиск оператором @@

bash
CREATE INDEX ON t USING gin (jsonb_col jsonb_path_ops);

Компактный GIN для JSONB под оператор @>

§ см. также

  • gist-spgistGiST и SP-GiSTGiST - каркас деревьев для пересечений, содержания и расстояний (&&, @>, <->): геометрия, диапазоны, exclusion constraint. SP-GiST делит пространство на непересекающиеся части (точки, IP, префиксы). Оба lossy.
  • operator-classesOperator classes и выбор индексаИндекс работает не «на колонке», а для конкретных операторов над ней. Связь тип+оператор+метод доступа задаёт operator class. Через каталог pg_amop можно узнать, какой AM поддерживает оператор: @> знают gin и gist, не btree.
  • index-designПроектирование индексовИндекс - отсортированный список. Составной (a,b,c) работает по префиксу слева направо, не по средней колонке. Покрывающие (INCLUDE), частичные (WHERE) и по выражению сужают работу; лишние индексы - налог на запись.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки