В PostgreSQL несколько типов индексов, каждый для своих задач:
B-tree (по умолчанию) — для сравнений =, <, >, BETWEEN, ORDER BY. Покрывает 90% случаев.
Hash — только для =, чуть быстрее B-tree для точного совпадения, но не поддерживает сортировку.
GIN (Generalized Inverted Index) — для полнотекстового поиска, JSONB, массивов. Ищет вхождения элемента в коллекцию.
GiST (Generalized Search Tree) — для геоданных (PostGIS), диапазонов, нечёткого поиска.
BRIN (Block Range Index) — для огромных таблиц с естественной сортировкой (логи по дате). Очень компактный.
Ещё бывают составные (multi-column), частичные (WHERE condition) и покрывающие (INCLUDE) индексы.