🔍 Мини-гайд: Индексы в PostgreSQL 1. Зачем нужны индексы? ▪ ...
🔍 Мини-гайд: Индексы в PostgreSQL
1. Зачем нужны индексы?
▪ Ускоряют SELECT, JOIN, ORDER BY, GROUP BY.
▪Снижают нагрузку при выборках без полного сканирования таблицы.
2. Типы индексов
▪B-tree (по умолчанию): точный поиск (=), диапазоны (<, >), сортировки.
CREATE INDEX idx_users_email ON users(email);
▪Hash: для точного сравнения, но используется редко.
▪GIN: массивы и полнотекстовый поиск.
CREATE INDEX idx_docs_content
ON documents USING GIN(to_tsvector('russian', content));
▪GiST: геоданные (PostGIS), диапазоны (int4range, tsrange).
▪BRIN: очень большие таблицы, где данные «почти упорядочены» (по дате).
CREATE INDEX idx_logs_created_at
ON logs USING BRIN(created_at);
3. Практические советы
▪Оценивайте запросы через EXPLAIN ANALYZE или pg_stat_statements.
▪Не создавайте индекс «про запас»: каждый замедляет INSERT/UPDATE/DELETE.
▪Составные индексы: порядок колонок критичен.
CREATE INDEX idx_users_city_age
ON users(city, age);
▪Избегайте низкокардинальных колонок (boolean, ENUM) — индекс неэффективен, если фильтр возвращает большинство строк.
▪Актуализируйте статистику: запускайте ANALYZE после больших загрузок/удалений.
▪Удаляйте устаревшие индексы:
DROP INDEX IF EXISTS idx_old_column;
▪Используйте REINDEX для устранения фрагментации:
REINDEX INDEX idx_users_email;
4. Подводные камни
▪Бесполезный индекс: если WHERE возвращает ≥90% строк (например, is_active = true при 99% активных).
▪Функциональные индексы: CREATE INDEX ON table ((LOWER(name))) сработает только при точном вызове WHERE LOWER(name) = 'ivan'.
▪Блокировки: для создания без блокировки пишите:
CREATE INDEX CONCURRENTLY idx_orders_status ON orders(status);
Но этот процесс дольше и требует больше места.
▪Индексы на внешних ключах: без них при удалении/обновлении родительской записи будут долгие сканы.
Итог:
Индексы — мощный инструмент, если их грамотно использовать. Анализируйте планы запросов, не создавайте лишних, следите за статистикой и удаляйте устаревшие.
Сохрани, чтобы не забыть, и поделись с коллегами. А как ты выбираешь индексы у себя? Пиши в комментариях!
👉 [club79831840|@Bookflow]