Сначала Измерь
Перед тем как что-либо менять, воспроизведи проблему и запиши исходные показатели производительности. Используй EXPLAIN или EXPLAIN ANALYZE, чтобы посмотреть на план выполнения и определить узкие места, такие как последовательные сканирования, дорогостоящие сортировки или неточные оценки количества строк.
Исправь Основы
- Убедись, что статистика таблиц актуальна, чтобы оптимизатор принимал правильные решения
- Добавь индексы на нужные колонки в условиях
WHERE, JOIN и ORDER BY
- Используй саргабельные предикаты — не оборачивай индексированные колонки в функции, это мешает использованию индекса
Сокращай Данные Рано
- Применяй селективные фильтры
WHERE как можно раньше
- Не используй
SELECT * — выбирай только те колонки, которые тебе нужны
- Предпочитай
EXISTS вместо IN для полусоединений, чтобы избежать лишнего сканирования строк
Контролируй Взрывной Рост Строк
- Проверяй селективность JOIN, чтобы join'ы не перемножали строки неожиданно
- Дедублицируй данные перед join, если нужно
- Предварительно агрегируй большие наборы данных перед join, чтобы сократить размер промежуточных результатов
Переписывай Проблемные Паттерны
- Замени широкие условия
OR на
UNION ALL
, чтобы лучше использовать индексы в каждой ветке
- Замени коррелированные подзапросы на эквивалентные join'ы, которые оптимизатор может обработать эффективнее
Масштабируй на Больших Объёмах
Для запросов, работающих с очень большими объёмами данных:
- Используй keyset pagination вместо
OFFSET, чтобы избежать сканирования отброшенных строк
- Рассмотри материализованные представления для предварительного вычисления дорогостоящих агрегаций
- Оцени возможность партиционирования, чтобы ограничить область сканирования
- Применяй кеширование на уровне приложения для часто повторяющихся запросов с преобладающим чтением