# 1. B-tree (Balanced Tree)

postgres 1 / 8
2 min read
Table of Contents

Типы индексов в PostgreSQL: полный обзор и рекомендации по выбору
Оптимизация запросов через правильное использование индексов

Введение
Индексы в PostgreSQL — это мощный инструмент для ускорения выполнения запросов. Они работают как «оглавление» таблицы, позволяя СУБД быстро находить нужные данные без полного сканирования. Однако выбор подходящего типа индекса зависит от структуры данных, типа запросов и специфики нагрузки. В этой статье разберем основные виды индексов в PostgreSQL, их особенности и сферы применения.


1. B-tree (Balanced Tree)

Назначение: Стандартный индекс, используемый по умолчанию.
Поддерживаемые операции: =, >, <, BETWEEN, LIKE 'pattern%', сортировка.
Применение:

  • Для числовых, строковых данных и дат.
  • Оптимизация запросов с диапазонами и порядком.
    Пример:
CREATE INDEX idx_users_email ON users USING btree (email);

Особенности:

  • Поддерживает уникальность (UNIQUE).
  • Эффективен для небольших и средних таблиц.

2. Hash

Назначение: Ускорение поиска строгого равенства (=).
Применение:

  • Точечные запросы, например, поиск по первичному ключу.
    Пример:
CREATE INDEX idx_products_id ON products USING hash (id);

Особенности:

  • Не поддерживает сортировку, диапазоны или частичное совпадение.
  • В версиях PostgreSQL до 10.x не журналируется (риск потери при сбое).

3. GiST (Generalized Search Tree)

Назначение: Для сложных типов данных и многомерных структур.
Поддерживаемые типы: Геоданные (PostGIS), полнотекстовый поиск, диапазоны (range).
Пример для геоданных:

CREATE INDEX idx_gis_coords ON locations USING gist (coords);

Применение:

  • Поиск ближайших соседей (KNN).
  • Проверка пересечения геообъектов.

4. SP-GiST (Space-Partitioned Generalized Search Tree)

Назначение: Для неоднородных данных с иерархической структурой.
Поддерживаемые типы: IP-адреса, квадродеревья, префиксы.
Пример для IP-адресов:

CREATE INDEX idx_network_ip ON network USING spgist (ip inet_ops);

Применение:

  • Эффективный поиск в сетевых диапазонах.
  • Работа с регулярными выражениями.

5. GIN (Generalized Inverted Index)

Назначение: Для составных значений (массивы, JSONB, полнотекстовый поиск).
Пример для JSONB:

CREATE INDEX idx_profile_data ON profiles USING gin (profile_data);

Применение:

  • Поиск элементов в массивах (@>).
  • Индексация JSON-документов.
  • Полнотекстовый поиск (вектор tsvector).

Особенности:

  • Занимает больше места, чем GiST, но работает быстрее на чтение.

6. BRIN (Block Range Index)

Назначение: Для очень больших таблиц с упорядоченными данными.
Применение:

  • Данные, отсортированные по времени (логи событий).
    Пример:
CREATE INDEX idx_sensor_data_time ON sensor_data USING brin (timestamp);

Особенности:

  • Минимальные затраты на хранение.
  • Эффективен, если данные физически упорядочены на диске.

7. Другие индексы и расширения

  • Bloom: Для многоколоночных запросов с фильтрами (требует расширения bloom).
  • RUM: Расширение GIN для ранжирования в полнотекстовом поиске.
  • Covering Indexes (INCLUDE): Добавление дополнительных столбцов для покрывающих индексов (с версии 11).

Как выбрать индекс?

  • B-tree: Универсальный выбор для большинства сценариев.
  • GIN/GiST: Для составных данных (JSON, массивы, геообъекты).
  • BRIN: Для больших логов с временной сортировкой.
  • Hash: Если нужны только операции = и нет рисков с журнализацией.

Заключение
Правильный выбор индекса в PostgreSQL значительно ускоряет выполнение запросов, но требует анализа структуры данных и рабочих нагрузок. Используйте B-tree как базовый вариант, а для специализированных задач (геоданные, JSON, полнотекст) применяйте GiST, GIN или BRIN. Не забывайте тестировать производительность и следить за размером индексов!

Next: Работа с данными из нескольких таблиц в PostgreSQL: полное руководство
Аватар автора

Спасибо, что прочитали статью. Посмотрите другие материалы в архиве, там много практических разборов по разным технологиям.


postgres Series

# 1. B-tree (Balanced Tree)

postgres 1 / 8
2 min read

Типы индексов в PostgreSQL: полный обзор и рекомендации по выбору Оптимизация запросов через правильное использование индексов Введение Индексы в PostgreSQL — это мощный инструмент для ускорения…

Continue

# Работа с данными из нескольких таблиц в PostgreSQL: полное руководство

postgres 2 / 8
2 min read

PostgreSQL — мощная реляционная СУБД, предоставляющая множество инструментов для выборки данных из нескольких таблиц. В этой статье рассмотрим ключевые методы с примерами и советами по оптимизации.…

Read

# Что такое транзакция?

postgres 3 / 8
3 min read

Транзакции в PostgreSQL: Основы, Управление и Лучшие Практики Введение Транзакции — фундаментальный механизм обеспечения целостности данных в реляционных базах. В PostgreSQL они играют ключевую роль,…

Read

# Основы оконных функций

postgres 4 / 8
3 min read

Оконные функции в PostgreSQL: мощный инструмент аналитики Оконные функции (Window Functions) в PostgreSQL — это продвинутый инструмент для выполнения вычислений над группами строк, связанных с…

Read

# 1. Типы блокировок в PostgreSQL

postgres 5 / 8
3 min read

Блокировки в PostgreSQL: механизмы управления параллельным доступом к данным Введение В многопользовательских средах базы данных, таких как PostgreSQL, блокировки играют ключевую роль в обеспечении…

Read

# 1. Использование индексов

postgres 6 / 8
3 min read

Оптимизация запросов в PostgreSQL: лучшие практики для повышения производительности PostgreSQL — мощная СУБД с широкими возможностями, но даже она может столкнуться с проблемами производительности…

Read

# Рекурсивные запросы в PostgreSQL: Иерархии, графы и не только

postgres 7 / 8
3 min read

Рекурсивные запросы — мощный инструмент PostgreSQL для работы с иерархическими структурами и графами. Они позволяют обрабатывать данные, где элементы связаны друг с другом через родительско-дочерние…

Read