Ответ
Для оптимизации медленного SQL-запроса:
- Анализ плана выполнения (EXPLAIN ANALYZE) для выявления узких мест (full scans, сортировки, nested loops).
- Добавление индексов на поля в WHERE, JOIN, ORDER BY. Например:
CREATE INDEX idx_user_active ON users(is_active) WHERE is_active = true;
- Оптимизация JOIN - уменьшение таблиц перед соединением через подзапросы или CTE.
- Лимитирование данных - добавление LIMIT или фильтрация по датам.
- Переписывание сложных подзапросов на JOIN или временные таблицы.
Пример оптимизации:
-- Было
SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE signup_date > '2023-01-01');
-- Стало
WITH recent_users AS (
SELECT id FROM users WHERE signup_date > '2023-01-01'
)
SELECT o.* FROM orders o JOIN recent_users u ON o.user_id = u.id;
Важно тестировать изменения на копии prod-данных и мониторить влияние на нагрузку БД.