← Назад к вопросам

Какие знаешь типы index в БД?

1.7 Middle🔥 201 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы индексов в базах данных

Индексы — это критически важная часть оптимизации БД. Они позволяют быстро находить данные без необходимости сканировать всю таблицу.

B-Tree индекс

Это самый распространённый тип. Используется по умолчанию в PostgreSQL, MySQL и других БД.

// SQL пример
CREATE INDEX idx_users_email ON users(email);

Преимущества:

  • Эффективен для операций сравнения (=, <, >, <=, >=, BETWEEN)
  • Поддерживает ORDER BY и GROUP BY
  • Хорошо работает с range queries

Когда использовать:

  • Поиск по точному значению
  • Range queries
  • Сортировка

Hash индекс

Быстро работает для точного поиска, но не для range queries.

CREATE INDEX idx_hash ON users USING HASH(user_id);

Преимущества:

  • Очень быстро для точного поиска (O(1) в среднем)
  • Компактнее B-Tree

Недостатки:

  • Не работает для BETWEEN, >, <
  • Не поддерживает ORDER BY
  • Медленнее при разрастании таблицы

GiST (Generalized Search Tree)

Используется для сложных типов данных: геометрические данные, полнотекстовый поиск, массивы.

CREATE INDEX idx_location ON locations USING GIST(coordinates);

Применение:

  • PostGIS (геопространственные данные)
  • Full-text search
  • JSON документы

GIN (Generalized Inverted Index)

Отличен для поиска внутри сложных структур.

CREATE INDEX idx_tags ON posts USING GIN(tags);

Лучше для:

  • JSON и JSONB полей
  • Массивов
  • Полнотекстового поиска

BRIN (Block Range INdex)

Легковесный индекс для очень больших таблиц.

CREATE INDEX idx_created_at ON events USING BRIN(created_at);

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

  • Минимальный расход памяти
  • Эффективен для времени-ориентированных данных
  • Медленнее B-Tree, но масштабируется лучше

Комбинированные (Composite) индексы

Индексы по нескольким колонкам.

// Важно: порядок колонок имеет значение
CREATE INDEX idx_user_email_status ON users(email, status);

// Хорошо для:
SELECT * FROM users WHERE email = ? AND status = ?;

// Плохо для:
SELECT * FROM users WHERE status = ?; // status не первым

Частичные (Partial) индексы

Индекс только для части данных.

// Индексируем только активных пользователей
CREATE INDEX idx_active_users ON users(email) WHERE status = 'active';

Плюсы:

  • Меньше памяти
  • Быстрее обновления

Unique индекс

Энфорсит уникальность.

CREATE UNIQUE INDEX idx_email ON users(email);

Практические советы

  1. Измеряй перед оптимизацией — профилируй запросы
  2. Избегай лишних индексов — каждый индекс замедляет INSERT/UPDATE
  3. Комбинированные индексы лучше чем множество одиночных — для часто совместных WHERE условий
  4. Используй EXPLAIN ANALYZE чтобы понять используется ли индекс
  5. Регулярно обслуживай — REINDEX, VACUUM в PostgreSQL
// Проверить используется ли индекс
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

Обычно для приложений достаточно B-Tree индексов на первичные ключи, внешние ключи и часто используемые WHERE/JOIN условия.

Какие знаешь типы index в БД? | PrepBro