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

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. Эффективность сильно зависит от физического порядка данных.