Какой тип индекса выбрать в PostgreSQL?
Индексы — мощный инструмент для ускорения запросов, но не все они одинаково полезны. В PostgreSQL есть несколько типов индексов, и вот как не промахнуться с выбором:
🔹 B-tree (по умолчанию)
📌 Лучший выбор для: =, <, >, BETWEEN, ORDER BY.
✅ Поддерживает сортировку.
💡 Используется в 90% случаев.
CREATE INDEX idx_users_name ON users(name);
🔹 Hash
📌 Только для точного сравнения =.
🚫 Не поддерживает диапазоны, сортировку, LIKE.
⚠️ Редко используется, но может быть быстрее B-tree на =.
CREATE INDEX idx_users_email_hash ON users USING hash(email);
🔹 GIN (Generalized Inverted Index)
📌 Для массивов, jsonb, full-text search.
💡 Отличен при поиске по вложенным структурам или множеству значений.
CREATE INDEX idx_data_tags ON posts USING gin(tags);
🔹 GiST (Generalized Search Tree)
📌 Для геоданных (PostGIS), поиска по диапазонам, tsvector.
💡 Более универсален, но медленнее в некоторых кейсах, чем GIN.
CREATE INDEX idx_events_location ON events USING gist(location);
🔹 BRIN (Block Range Index)
📌 Для огромных таблиц, где данные физически упорядочены.
💡 Занимает очень мало места.
⚠️ Не всегда эффективен — зависит от корреляции данных.
CREATE INDEX idx_logs_timestamp ON logs USING brin(timestamp);
✅ Не кидайтесь ставить индекс "на всякий случай". Подбирай тип под паттерн запроса и тип данных.
#db
👉 @database_info