Каковы основные причины медленных запросов в базе данных и как их устранить?

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

Ответ

Основные причины медленных SQL-запросов:

  1. Отсутствие индексов — приводит к полному сканированию таблицы (FULL TABLE SCAN).
  2. Неоптимальные JOIN — соединение больших таблиц без подходящих ключей.
  3. Выбор избыточных данных — использование SELECT * вместо конкретных полей.
  4. Блокировки (Lock Contention) — конкуренция за ресурсы при параллельных операциях.
  5. Неэффективные условия WHERE — функции над колонками, неселективные фильтры.

Пример проблемного запроса:

SELECT * FROM orders WHERE customer_id = 123 AND status = 'PENDING';

Без индекса по (customer_id, status) выполняется последовательное сканирование всей таблицы orders.

Способы оптимизации:

  • Добавить составной индекс:
    CREATE INDEX idx_orders_customer_status ON orders(customer_id, status);
  • Ограничить выборку полей:
    SELECT id, amount FROM orders WHERE customer_id = 123 AND status = 'PENDING';
  • Использовать EXPLAIN (или EXPLAIN ANALYZE) для анализа плана выполнения и выявления "узких мест".
  • Переписать запрос, разбивая сложные операции, или использовать временные таблицы.