EXPLAIN - шаг к оптимизации запросов

EXPLAIN в MySQL Оптимизация запросов в MySQL занимает огромную роль при построении web (и не только) приложений. Одним из операторов, который приходит на помощь является оператор EXPLAIN. В заметке приводится краткая информация для знакомства с этим оператором. Изображение для заметки взято с Планеты MySQL, там же (смотреть ниже изображений) есть полезные ссылки на презентации с Oracle Open World 2011 (Explaining the MySQL Explain и Improving Performance with Better Indexes), а также ссылка на книгу Optimizing SQL Statements, которую уже сейчас хочу купить:)

EXPLAIN

Выражение EXPLAIN может быть использовано для получения информации о выполняемом запросе (SELECT,UPDATE,DELETE,INSERT,REPLACE выделенные операторы можно использовать только начиная с версии сервера 5.6) или использовано в качестве синонима для выражения DESCRIBE:

  • Если выражение EXPLAIN предшествует выражению SELECT, MySQL отображает информацию, которая может быть полезна оптимизатору запросов. MySQL возвращает информацию о том как проходит процесс выполнения запроса, включая информацию об объединении и порядке таблицe. EXPLAIN EXTENDED может применяться для получения дополнительной информации.
  • EXPLAIN EXTENDED отличается от EXPLAIN, тем, что выводит дополнительную информацию. К сожалению по этому выражению документация не дает никаких подробностей. А на практике при выполнении запроса появляется значение еще одного столбца filtered.

  • С версии MySQL 5.1.5 доступно выражение EXPLAIN PARTITIONS, использующееся только при рассмотрении секционированных таблиц
  • EXPLAIN tbl_name является синонимом DESCRIBE tbl_name или SHOW COLUMNS FROM tbl_name.

Пример использования EXPLAIN для анализа запроса

  1. EXPLAIN SELECT p.*
  2. FROM parent p
  3. WHERE NOT EXISTS (
  4. SELECT parent_id FROM child c
  5. WHERE c.parent_id = p.id)\G

При помощи EXPLAIN вы можете определить где нужно добавить индексы, чтобы повысить скорость выполнения запросов. Кроме того вы можете использовать выражение EXPLAIN для того чтобы посмотреть, как оптимизатор запросов соединяет таблицы. Чтобы не дать оптимизатору самостоятельно располагать последовательность таблиц, а отображать эту последовательность в виде, заданном запросом нужно записать селект в флагом SELECT STRAIGHT_JOIN .
Если у вас возникли проблемы с индексом (например они перестали использоваться), вы можете выполнить выражение ANALYZE TABLE для обновления статистики о таблицах, такой как ключи, которые могут повлиять на выбор оптимизатора.
Результат работы оператора EXPLAIN состоит из строк со следующими полями:
Id: Идентификатор запроса (порядковый номер)
Select_type: одно из значений, указанных в списке

  • PRIMARY Внешнее или левое объединение, или просто SELECT
  • SUBQUERY Первый запрос SELECT в подзапросе
  • DEPEDENT SUBQUERY Как SUBQUERY, но зависит от внешнего запроса
  • UNION Второй и дальнейшие запросы SELECT в объединении
  • DEPENDENT UNION Как и UNION, но с зависимостью от внешнего запроса
  • SIMPLE Запрос SELECT, без объединений UNION и без подзапросов
  • UNION RESULT Результирующий UNION
  • DERIVED Подзапрос в предложении FROM

Table: таблица, к которой относится запрос
Type: тип соединения, осуществляемый MySQL. Встречающиеся варианты в порядке ухудшения качества.

  • system
  • const
  • eq_ref
  • ref
  • range
  • index
  • ALL

Possible_key: кандидаты в индексы для нахождения строк в таблице.
Key: используемый индекс, значение NULL означает что индексы не используются
Key_len: Длина используемой части индекса
Ref: Значение ,с которым MySQL сравнивает значение индекса
Rows: приблизительное число строк таблицы, которое MySQL необходимо рассмотреть перед выполнением запроса.
Extra: другая информация

Здравствуйте!

Хочется скопировать вашу статью и опубликовать у себя на блоге.
Разумеется, будет ссылка на ваш сайт

Публикуйте.

Публикуйте.

Отправить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, пьёте ли Вы кофе или рассылаете спам
6 + 8 =
Решите эту простую математическую задачу и введите результат. То есть для 1+3, введите 4.