Существуют следующие основные виды индексов:
B-tree (B-дерево) - самый распространенный тип, подходящий для большинства типичных запросов (равенство, сравнение, диапазон). Основан на сбалансированном дереве.
Hash (Хеш) - используется для проверки на равенство (=). Быстрее B-tree для таких запросов, но не поддерживает сравнения и диапазоны. Хранит хеш-значение ключа и указатель на строку.
GiST (Generalized Search Tree) - обобщенная структура дерева поиска, позволяющая строить различные индексы для сложных типов данных (геометрические, текстовые с полнотекстовым поиском). Основан на сбалансированном дереве.
SP-GiST (Space-Partitioned Generalized Search Tree) - специализированная версия GiST для данных, которые можно разделить по пространству (например, точки, прямоугольники). Примеры: k-d деревья, quadtrees.
GIN (Generalized Inverted Index) - обобщенный инвертированный индекс, в основном для поиска элементов внутри составных значений (например, массивы, JSONB). Часто используется для полнотекстового поиска.
BRIN (Block Range INdex) - индекс диапазона блоков. Подходит для очень больших таблиц с естественно упорядоченными данными (например, по времени). Индексирует диапазон значений в физических блоках диска.
Bloom (Блум-фильтр) - не совсем традиционный индекс, скорее вероятностная структура данных для быстрой проверки на отсутствие элемента. Используется для ускорения выборки из очень больших таблиц, когда точное совпадение не требуется или как дополнительный фильтр перед сканированием основного индекса.
Примеры использования:
WHERE amount > 100).gist(location)), индексы для полнотекстового поиска (to_tsvector).spgist(point)).gin(tags)), JSONB (gin(data)), полнотекстовый поиск.timestamp в таблице логов, где данные упорядочены по времени.bloom(col1, col2, col3)) для быстрого отсева строк, где комбинация значений точно не присутствует.Выбор типа индекса зависит от типа данных столбца и вида запросов, которые необходимо оптимизировать.