Что такое EXPLAIN в SQL?

«Что такое EXPLAIN в SQL?» — вопрос из категории Базы данных, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

EXPLAIN — это SQL-команда (или её аналог), которая показывает план выполнения запроса, не выполняя его фактически. Это основной инструмент для анализа и оптимизации производительности запросов, позволяющий понять, как СУБД будет его обрабатывать: какие индексы она выберет, в каком порядке соединит таблицы и какие временные структуры создаст.

Типичный вывод EXPLAIN для C++ разработчика: Разработчик на C++, работающий с базами данных (например, через ODBC, libpqxx для PostgreSQL или MySQL Connector/C++), использует EXPLAIN для отладки «тяжёлых» запросов. Вывод — это набор строк, описывающих шаги (узлы) плана. Ключевые столбцы:

  • type / access_type: Метод доступа к таблице (ALL — полное сканирование, index — сканирование индекса, range — диапазон по индексу, const — поиск по уникальному ключу). ALL часто указывает на потенциальную проблему.
  • key: Индекс, который будет использован.
  • rows: Оценочное количество строк, которые должен обработать этот шаг.
  • Extra: Дополнительная информация (например, Using where, Using temporary, Using filesort). Using filesort или Using temporary могут сигнализировать о необходимости оптимизации.

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

-- Допустим, есть таблица 'orders' с индексами на (customer_id) и (status, created_at)
EXPLAIN 
SELECT * FROM orders 
WHERE customer_id = 100 AND status = 'shipped' 
ORDER BY created_at DESC;
Возможный вывод и его интерпретация: id select_type table type possible_keys key rows Extra
1 SIMPLE orders ref customer_id,status customer_id 15 Using where; Using filesort

Анализ: Запрос использует индекс по customer_id (это хорошо), но для фильтрации по status и сортировки по created_at приходится делать дополнительную работу (Using where; Using filesort). Это может быть медленно, если строк с customer_id=100 много. Решение из C++ перспективы: перед внедрением запроса в код можно предложить добавить составной индекс (customer_id, status, created_at), который покроет все условия и избавит от сортировки вручную.

EXPLAIN ANALYZE (PostgreSQL, MySQL 8.0+): Более мощная команда, которая фактически выполняет запрос и возвращает реальные метрики (время, количество возвращённых строк), что позволяет точно оценить стоимость каждого узла плана и найти узкие места.