Ответ
Оптимизация выполняется пошагово:
-
Анализ плана выполнения (EXPLAIN / EXPLAIN ANALYZE). Это первый и главный шаг. Ищу:
- Полные сканирования таблиц (Sequential Scan) вместо использования индексов.
- Дорогие операции:
Nested Loop,Hash Join, сортировки (Sort). - Неточные оценки количества строк (плохая статистика).
-
Поиск "узких мест" и их устранение:
- Добавление индексов. Чаще всего для колонок в условиях
WHERE,JOIN,ORDER BY. Использую покрывающие индексы (Covering Index), чтобы избежать обращений к таблице.-- До SELECT name, email FROM users WHERE city = 'Berlin'; -- Медленно, если city не проиндексирован -- После добавления индекса CREATE INDEX idx_users_city ON users(city) INCLUDE (name, email); - Переписывание запроса. Упрощение логики, избавление от избыточных подзапросов, корректное использование
JOINвместоIN. - Нормализация/денормализация данных. Иногда добавление вычисляемой колонки или небольшой избыточности ускоряет выборки.
- Обновление статистики. Команда
ANALYZE table_name;(в PostgreSQL) помогает планировщику выбрать оптимальный план. - Проверка на проблему N+1. Убеждаюсь, что приложение не делает тысячи простых запросов вместо одного сложного.
- Добавление индексов. Чаще всего для колонок в условиях
-
Профилирование и мониторинг. Использую инструменты БД (pg_stat_statements в PostgreSQL, Slow Query Log в MySQL) для постоянного выявления медленных запросов.