Какие основные типы индексов используются в реляционных базах данных?

«Какие основные типы индексов используются в реляционных базах данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Индексы ускоряют поиск данных, но замедляют вставку и обновление. Основные типы:

1. По структуре и алгоритму:

  • B-дерево (B-tree) — стандартный, сбалансированный индекс. Поддерживает быстрое равенство и диапазонные запросы (=, >, <, BETWEEN, LIKE 'prefix%').
    CREATE INDEX idx_user_email ON users(email);
  • Хеш-индекс (Hash) — работает только для операций равенства (=). Быстрее B-дерева для точного совпадения, но не поддерживает сортировку и диапазоны.
    CREATE INDEX idx_user_id ON users USING HASH(id); -- Синтаксис PostgreSQL
  • Bitmap-индекс — эффективен для колонок с низкой кардинальностью (мало уникальных значений, например, пол, статус).

2. По охвату данных:

  • Кластерный индекс (Clustered) — определяет физический порядок хранения строк в таблице. В одной таблице может быть только один кластерный индекс (часто — первичный ключ).
  • Некластерный индекс (Non-clustered) — создает отдельную структуру, которая указывает на данные. В таблице может быть много таких индексов.

3. По составу:

  • Составной индекс (Composite) — создается по нескольким столбцам. Порядок столбцов критически важен для производительности.
    CREATE INDEX idx_last_first ON employees(last_name, first_name);
    -- Этот индекс поможет для запросов с условием по last_name или по (last_name, first_name).
  • Покрывающий индекс (Covering) — индекс, который содержит все поля, запрашиваемые в SELECT. Это позволяет выполнить запрос, обращаясь только к индексу, без чтения таблицы ("index-only scan").

4. Специализированные (PostgreSQL пример):

  • GIN (Generalized Inverted Index) — для составных значений: полнотекстовый поиск, JSONB, массивы.
  • GiST (Generalized Search Tree) — для геоданных, полнотекстового поиска, деревьев.

Выбор индекса: Зависит от шаблонов запросов (WHERE, JOIN, ORDER BY). Сначала анализируйте медленные запросы с помощью EXPLAIN.