Использовали ли вы EXPLAIN для анализа SQL-запросов?

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

Ответ

Да, EXPLAIN (или EXPLAIN ANALYZE в PostgreSQL) — это мой основной инструмент для диагностики медленных запросов и оптимизации работы с базой данных.

Как я это применяю на практике:

  1. Выявляю проблемный запрос через лог медленных запросов или мониторинг (например, Laravel Telescope).
  2. Анализирую план выполнения. Ключевое, на что смотрю:
    • type (в MySQL) / type (в PostgreSQL): ALL (полное сканирование таблицы) — это красный флаг.
    • key (в MySQL): Указывает, используется ли индекс. NULL — плохой знак.
    • rows: Оценочное количество строк, которое движку БД придется проверить. Чем меньше, тем лучше.
    • Extra: Поле с подсказками, например, Using filesort или Using temporary — часто указывает на необходимость оптимизации.

Пример из жизни: Был запрос для поиска пользователей по email и дате регистрации:

SELECT * FROM users WHERE email LIKE '%@example.com' AND created_at > '2023-01-01';

EXPLAIN показал type: ALL и key: NULL. Запрос выполнял полное сканирование таблицы на миллионах записей.

Решение:

  1. Добавил составной индекс, покрывающий оба поля в условии WHERE:
    CREATE INDEX idx_users_email_created ON users(email, created_at);
  2. Переписал запрос, чтобы он мог эффективно использовать индекс (избегая LIKE с ведущим %, где это возможно).

После этого EXPLAIN показал type: range и использование нового индекса, что привело к ускорению запроса в сотни раз.