Ответ
Индекс — это специальная структура данных в СУБД, которая позволяет значительно ускорить операции поиска и выборки данных, но при этом замедляет операции вставки, обновления и удаления.
Основные типы индексов:
B-Tree (B-дерево)
- Описание: Самый распространенный тип индекса. Данные хранятся в отсортированном виде, что позволяет эффективно выполнять поиск по точному значению, диапазону, а также использовать
LIKE
с префиксом ('abc%'
). - Применение: Используется по умолчанию в большинстве СУБД (например, PostgreSQL, MySQL) для большинства типов данных.
- Операторы:
=
,>
,<
,BETWEEN
,IN
,IS NULL
,LIKE 'prefix%'
.
- Описание: Самый распространенный тип индекса. Данные хранятся в отсортированном виде, что позволяет эффективно выполнять поиск по точному значению, диапазону, а также использовать
Hash-индекс
- Описание: Основан на хэш-таблице. Обеспечивает очень быстрый поиск по точному совпадению, но не поддерживает поиск по диапазону.
- Применение: Идеален для запросов на точное равенство.
- Операторы: только
=
.
GIN (Generalized Inverted Index / Обобщенный инвертированный индекс)
- Описание: Предназначен для индексации составных значений, таких как элементы массива,
JSONB
или полнотекстовый поиск. Индекс хранит пары (значение, список ID строк). - Применение: Поиск по элементам в массивах, ключам в
JSONB
, полнотекстовый поиск.
- Описание: Предназначен для индексации составных значений, таких как элементы массива,
GiST (Generalized Search Tree / Обобщенное поисковое дерево)
- Описание: Гибкий индекс, который можно использовать для различных видов данных и нестандартных правил индексации.
- Применение: Геопространственные данные (PostGIS), полнотекстовый поиск, поиск по пересечению диапазонов.
BRIN (Block Range INdex / Индекс по диапазонам блоков)
- Описание: Хранит только минимальное и максимальное значение для больших диапазонов страниц (блоков) таблицы. Имеет очень маленький размер.
- Применение: Очень большие таблицы, данные в которых физически отсортированы (например, по дате создания).
Другие важные концепции:
- Составной (Composite) индекс: Индекс, построенный сразу по нескольким колонкам. Порядок колонок в индексе имеет решающее значение.
- Покрывающий (Covering) индекс: Индекс, который содержит все поля, необходимые для выполнения запроса. В этом случае СУБД не нужно обращаться к самой таблице, что значительно ускоряет чтение.
Пример создания индекса в PostgreSQL:
-- Стандартный B-Tree индекс для ускорения поиска по email
CREATE INDEX idx_users_email ON users(email);
-- GIN индекс для поиска по тегам в JSONB поле
CREATE INDEX idx_posts_metadata_tags ON posts USING GIN ((metadata->'tags'));