Какой индекс под какой запрос: B-tree, GIN, GiST, BRIN, hash
B-tree — рабочая лошадка: равенство, диапазоны, сортировка, префиксный поиск по строке; покрывает 90% задач и единственный поддерживает ORDER BY без сортировки. GIN — для значений, внутри которых много элементов: массивы, JSONB, полнотекстовый поиск, триграммы для LIKE '%текст%'; быстрый на чтение, дорогой на запись, частично компенсируется отложенным обновлением через fastupdate. GiST — для геометрии, диапазонных типов и ограничений исключения; поддерживает поиск ближайших соседей. BRIN — крошечный индекс для больших таблиц, где физический порядок строк совпадает с порядком значений: логи и метрики по времени; занимает килобайты вместо гигабайтов, но бесполезен на неупорядоченных данных. Hash — только равенство, начиная с PostgreSQL 10 журналируется и переживает падение, но выигрывает у B-tree редко. Выбор диктует не тип данных, а форма предиката в запросе.