Какие основные методы оптимизации SQL-запросов вы знаете?

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

Ответ

Оптимизация запросов направлена на снижение нагрузки на БД и уменьшение времени отклика.

Основные методы:

  1. Использование индексов: Создание индексов на столбцах, используемых в условиях WHERE, JOIN и ORDER BY.

    -- Индекс для ускорения поиска и сортировки
    CREATE INDEX idx_users_email ON users(email);
    CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);
  2. Оптимизация структуры запроса:

    • Избегайте SELECT * — выбирайте только нужные столбцы.
    • Используйте JOIN вместо коррелированных подзапросов, где это возможно.
    • Применяйте LIMIT для пагинации.
      
      -- Плохо
      SELECT * FROM orders WHERE total > 1000;

    -- Лучше SELECT id, total, created_at FROM orders WHERE total > 1000 ORDER BY created_at DESC LIMIT 50;

  3. Анализ плана выполнения: Используйте EXPLAIN (или EXPLAIN ANALYZE) для понимания того, как СУБД выполняет запрос, и выявления узких мест (например, полных сканирований таблиц — Seq Scan).

  4. Кэширование: Применение кэширования результатов часто выполняемых или тяжелых запросов на уровне приложения (Redis, Memcached) или с использованием кэша второго уровня в ORM (например, Hibernate).

  5. Пакетная обработка: Объединение множества операций INSERT/UPDATE в пакеты для уменьшения сетевых издержек и нагрузки на БД.

  6. Нормализация/денормализация: Правильная нормализация схемы БД для устранения аномалий. В некоторых случаях для чтения целесообразна контролируемая денормализация.