0Pricing
SQL Academy · Урок

Индексы B-tree, Hash, GiST и GIN

Сравните основные типы индексов в PostgreSQL и выберите подходящий для запросов на равенство, диапазоны, геометрию, JSON и полнотекстовый поиск

«Индексы B-tree, Hash, GiST и GIN» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Обзор типов индексов

В PostgreSQL есть несколько типов индексов, каждый из которых оптимизирован для определённых способов доступа:

  • B-дерево — равенство и диапазоны (по умолчанию)
  • Хеш — только равенство
  • GiST — геометрия, полнотекстовый поиск, пользовательские типы
  • GIN — составные значения (массивы, JSONB, полнотекстовый поиск)
  • BRIN — диапазоны блоков — огромные отсортированные таблицы
  • Деревья с разбиением пространства — деревья с пространственным разбиением

B-дерево: значение по умолчанию

Используется в 95 % случаев. Поддерживает =, <, <=, >, >=, BETWEEN, ORDER BY:

CREATE INDEX users_email_idx ON users(email);
CREATE INDEX orders_created_at_idx ON orders(created_at DESC);

Хеш-индекс

Только поиск по равенству. Безопасен при сбоях начиная с PG 10. Меньше и немного быстрее B-дерева для чистого поиска по равенству, но область применения очень узкая:

CREATE INDEX sessions_token_hash ON sessions USING HASH (token);
-- Useful for very high-cardinality equality lookups; usually B-tree is fine.

Индекс GiST

Обобщённое дерево поиска — расширяемое, с поддержкой типов диапазонов, геометрических типов, IP-адресов и полнотекстового поиска:

CREATE INDEX events_during_idx ON events USING GIST (during);
-- 'during' is a tstzrange — finds overlapping ranges efficiently.

CREATE INDEX places_location_idx ON places USING GIST (location);
-- PostGIS geometry — nearest neighbour, intersects.

Индекс GIN

Обобщённый инвертированный индекс — лучше всего подходит для составных значений, где каждому элементу соответствует много строк:

CREATE INDEX articles_tags_gin ON articles USING GIN (tags);
-- tags is TEXT[]; query with @> or && operators

CREATE INDEX articles_doc_gin ON articles USING GIN (search_doc);
-- For tsvector full-text search

CREATE INDEX events_data_gin ON events USING GIN (data jsonb_path_ops);
-- For JSONB containment queries

Индекс BRIN

Индексы диапазонов блоков обобщают диапазоны значений для каждых N страниц. Крошечные (килобайты для терабайтных таблиц), но эффективны только тогда, когда данные физически отсортированы по индексированному столбцу:

CREATE INDEX events_ts_brin ON events USING BRIN (ts);
-- Excellent for append-only time-series tables.

Сравнение размеров

Для таблицы с миллиардом строк:

  • B-дерево по столбцу BIGINT: примерно 30 GB
  • BRIN по столбцу TIMESTAMPTZ: примерно 1 MB

BRIN значительно меньше, но превосходит B-дерево только для последовательных / отсортированных запросов.

Выбор типа индекса

Порядок выбора:

  • Равенство + диапазон для скалярного значения → B-дерево
  • Равенство в огромном наборе скалярных значений → B-дерево (хеш — только если вы провели измерения)
  • Массивы / JSONB / полнотекстовый поиск → GIN
  • Типы диапазонов, геометрия, нечёткий поиск по тексту → GiST
  • Огромная отсортированная таблица, только добавление → BRIN

Компромиссы GIN

GIN быстрее всего обрабатывает запросы «найти все строки, содержащие X», но INSERT/UPDATE выполняются медленнее, чем для B-дерева. Для таблиц с очень интенсивной записью рассмотрите fastupdate=off, чтобы управлять отложенным списком GIN.

Классы операторов

Каждый тип индекса работает с определёнными операторами. Для JSONB используется jsonb_path_ops — это более компактные и быстрые индексы только для проверки вхождения:

CREATE INDEX e_data_gin ON events USING GIN (data jsonb_path_ops);
-- Half the size of default jsonb_ops, supports @> only.

Составные индексы разных типов

Составные индексы B-дерева используют сопоставление по левому префиксу. Составные индексы GIN работают, но они больше; обычно создают отдельные индексы GIN для одного столбца.

Итоги

Выбирайте тип индекса в соответствии с запросом.

  • B-дерево: по умолчанию
  • GIN: массивы/JSONB/полнотекстовый поиск
  • GiST: диапазоны/геометрия/нечёткий поиск
  • BRIN: последовательная обработка/таблицы только с добавлением

Быстрая проверка

Вы создаёте индекс для столбца TEXT[] для запросов «содержит». Какой тип индекса подходит?

Часто задаваемые вопросы

Урок «Индексы B-tree, Hash, GiST и GIN» бесплатный?

Да — полный текст урока «Индексы B-tree, Hash, GiST и GIN» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Индексы B-tree, Hash, GiST и GIN»?

Сравните основные типы индексов в PostgreSQL и выберите подходящий для запросов на равенство, диапазоны, геометрию, JSON и полнотекстовый поиск Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Индексы B-tree, Hash, GiST и GIN»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Индексы B-tree, Hash, GiST и GIN
  2. Составные индексы и порядок столбцов
  3. Частичные индексы и индексы по выражениям
  4. Обслуживание индексов и раздувание
← Назад к SQL Academy