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