Какие знаешь индексы в БД
Индексы — это ключевой механизм для оптимизации производительности баз данных.
Основные виды индексов:
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. Эффективность сильно зависит от физического порядка данных.
