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

Ответ

Да, 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 и использование нового индекса, что привело к ускорению запроса в сотни раз.

Ответ 18+ 🔞

Блин, смотри, EXPLAIN — это моя палочка-выручалочка, когда всё начинает тормозить. Без него я как слепой кот в подвале, нихуя не вижу, что там внутри базы творится.

Как я этим пользуюсь, чтобы не сойти с ума:

  1. Нахожу виновника. Смотрю в лог медленных запросов или в тот же Laravel Telescope — там сразу видно, какой запрос жрёт всё время, как не в себя.
  2. Включаю детектива и читаю план. Тут главное не обосраться от увиденного. Смотрю на ключевые вещи:
    • type (в MySQL/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. Добавил нормальный индекс. Не какой-то один, а составной, чтобы покрыть оба поля разом:
    CREATE INDEX idx_users_email_created ON users(email, created_at);
  2. Задумался над логикой. Понял, что LIKE '%@example.com' с процентом в начале — это убийца для индекса. Стал искать способ от него избавиться или переписать условие.

После этих манипуляций снова глянул в EXPLAIN — красота! type: range, индекс используется. Запрос ускорился так, что я сам от себя охуел. В общем, без этого инструмента — никуда, чистая магия для понимания, где собака зарыта.