Индексы в PostgreSQL: когда они реально помогают, а когда мешают
Многие ставят индексы “на всё подряд”, а потом удивляются, почему БД тормозит.
Типичные ошибки:
- Индекс на колонке, которая почти всегда уникальна (например, id с PK — он уже индексирован).
- Индекс на поле с низкой селективностью (is_active = true/false) — толку ноль, только замедляет вставки.
- Создание 5+ индексов на таблицу без анализа запросов.
Best practices:
- Делайте индекс под конкретный частый запрос.
- Для WHERE field LIKE 'abc%' — используйте btree.
- Для поиска по JSONB → GIN индекс.
- Для геоданных → GiST.
- Для частого условия — partial index:
Помните: каждый индекс ускоряет SELECT, но замедляет INSERT/UPDATE/DELETE.
Итог: индекс — это инструмент, а не магическая таблетка. Всегда проверяйте план выполнения (EXPLAIN ANALYZE).
Многие ставят индексы “на всё подряд”, а потом удивляются, почему БД тормозит.
Типичные ошибки:
- Индекс на колонке, которая почти всегда уникальна (например, id с PK — он уже индексирован).
- Индекс на поле с низкой селективностью (is_active = true/false) — толку ноль, только замедляет вставки.
- Создание 5+ индексов на таблицу без анализа запросов.
Best practices:
- Делайте индекс под конкретный частый запрос.
- Для WHERE field LIKE 'abc%' — используйте btree.
- Для поиска по JSONB → GIN индекс.
- Для геоданных → GiST.
- Для частого условия — partial index:
SQL:
CREATE INDEX idx_orders_active
ON orders(status)
WHERE status = 'active';
Помните: каждый индекс ускоряет SELECT, но замедляет INSERT/UPDATE/DELETE.
Итог: индекс — это инструмент, а не магическая таблетка. Всегда проверяйте план выполнения (EXPLAIN ANALYZE).