Индексы 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 — локальная установка не требуется.
Все уроки этого курса
- Индексы B-tree, Hash, GiST и GIN
- Составные индексы и порядок столбцов
- Частичные индексы и индексы по выражениям
- Обслуживание индексов и раздувание