advanced
Оптимизация SQL-запросов
Улучшайте планы запросов через индексы, селективные предикаты, форму pagination, устранение N+1 и измерение реальных планов.
Оптимизация запросов делает доступ к БД дешёвым и предсказуемым: нужные индексы, селективные предикаты, форма pagination и устранение N+1. Всегда смотрите **EXPLAIN** на объёмах, близких к production.
| Проблема | Направление фикса | |----------|-------------------| | N+1 | JOIN, batch `WHERE id IN (...)`, DataLoader | | Full table scan | Индекс под WHERE/ORDER BY | | Большой OFFSET | Keyset pagination | | Over-fetching | Только нужные колонки |
EXPLAIN ANALYZE
SELECT id, email FROM users WHERE tenant_id = $1 AND status = 'active' LIMIT 50;
ORM скрывает число запросов — логируйте queries per request в staging. Индекс под реальные фильтры; лишние индексы тормозят write.
На интервью: covering index; N+1 в Prisma/TypeORM; когда оправдана денормализация; lag read replica vs свежие чтения.
Типовые ошибки: индекс на каждую колонку; cache токсичных запросов; pagination с огромным OFFSET на миллионах строк.
Компромисс — чистая нормализованная схема против паттернов чтения и стоимости индексов.
Чеклист:
- EXPLAIN на горячих запросах.
- Счёт запросов на API call.
- Индексы под WHERE/ORDER BY.
- Строки examined vs returned.