Делал ли оптимизацию SQL-запросов?

«Делал ли оптимизацию SQL-запросов?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, многократно. Моя типичная последовательность действий:

  1. Выявление проблемных запросов: Использую лог медленных запросов (slow query log) или инструменты мониторинга (например, pg_stat_statements в PostgreSQL).
  2. Анализ плана выполнения: Применяю EXPLAIN (ANALYZE, BUFFERS) для детального разбора.
  3. Применение оптимизаций:
    • Индексы: Создание составных или частичных индексов под конкретные паттерны 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'; -- или создание функционального индекса