Встречается на собеседованиях • сегодня

Какие знаешь индексы в БД

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

Основные виды индексов:

1) B-Tree (B-дерево)

Самый распространенный тип. Подходит для большинства сценариев.

Принцип: Данные хранятся в сбалансированном дереве, что позволяет быстро находить значения (за логарифмическое время O(log n)).

Подходит для: точных совпадений (=), диапазонов (BETWEEN, >, <), сортировки (ORDER BY), а также поиска по префиксу в строковых типах.

Ограничение: Неэффективен для поиска по шаблону, где шаблон начинается с подстановочного знака (например, WHERE name LIKE '%сон').

2) Hash (Хеш-индекс)

Принцип: Строит хеш-таблицу, где каждому ключу соответствует хеш-код, который указывает на конкретное место в памяти.

Подходит для: ТОЛЬКО для операций точного совпадения (=). Не поддерживает операции с диапазонами, сортировку и частичное совпадение.

Плюсы: Очень высокая скорость для точечных запросов (в идеале O(1)).

Минусы: Неустойчив к коллизиям (разным ключам с одинаковым хешем). Не поддерживается во всех СУБД (например, в MySQL только для движка Memory).

3) GiST (Generalized Search Tree)

Принцип: Обобщенная структура дерева, которая позволяет реализовывать различные стратегии индексирования для сложных данных.

Подходит для: "Нетривиальных" данных — геопространственные данные (PostGIS), полнотекстовый поиск, массивы, диапазоны. Позволяет индексировать по принципу "находится ли точка A в области B?".

4) SP-GiST (Space-Partitioned GiST)

Принцип: Похож на GiST, но использует методы неупорядоченного разбиения пространства (например, префиксные деревья (trie), k-мерные деревья).

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

5) GIN (Generalized Inverted Index)

Принцип: Обратный индекс. Хранит пары (ключ, список идентификаторов строк), где этот ключ встречается. Аналогично тому, как работает индекс в конце учебника.

Подходит для: Данных, которые содержат несколько значений в одном поле — массивы ({a, b, c}), документы для полнотекстового поиска (to_tsvector), JSONB.

Плюсы: Очень эффективен для поиска "содержит ли?" (?, @>, <@).

6) BRIN (Block Range INdex)

Принцип: Хранит обобщенную информацию (мин./макс. значения) о последовательных диапазонах физических блоков данных на диске ("мега-страницах").

Подходит для: ОЧЕНЬ больших таблиц, где данные физически упорядочены (отсортированы) по индексируемому столбцу (например, по временным меткам timestamp).

Плюсы: Крайне малый размер и высокая скорость создания.

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

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы