Ответ
Да, многократно. Моя типичная последовательность действий:
- Выявление проблемных запросов: Использую лог медленных запросов (slow query log) или инструменты мониторинга (например, pg_stat_statements в PostgreSQL).
- Анализ плана выполнения: Применяю
EXPLAIN (ANALYZE, BUFFERS)для детального разбора. - Применение оптимизаций:
- Индексы: Создание составных или частичных индексов под конкретные паттерны
WHEREиJOIN. Например, для запросаSELECT * FROM orders WHERE user_id = ? AND status = 'shipped'создал индекс(user_id, status). - Переписывание запросов: Замена
INнаEXISTS, устранениеSELECT *, избавление от излишних вложенных подзапросов. - Нормализация/денормализация: В одном случае денормализировал таблицу, добавив вычисляемое поле, чтобы убрать дорогой
JOINв частом запросе.
- Индексы: Создание составных или частичных индексов под конкретные паттерны
Пример оптимизации:
-- Было: Полный перебор из-за отсутствия индекса и функции в WHERE
SELECT * FROM users WHERE LOWER(email) = 'user@example.com';
-- Стало: Использование индекса по email и предварительно приведённого значения
SELECT * FROM users WHERE email = 'USER@EXAMPLE.COM'; -- или создание функционального индекса