Explain

Рубрика:

День добрый. Думаю многие из вас используют mysql для хранения дб. Так вот как правило нам иногда нужно получить какие-то объемы информации из базы, делается это посредством запроса. Но иногда данные запросы выходят довольно долгими по времени выполнения и тогда задумываешься как же это все дело ускорить? А начинается это все с того что надо для начала понять как же происходит обращение к базе через наш запрос. И вот тут к нам на помощь приходит команда explain которая предоставляет подробную информацию о запросе. Ставим ее перед нашим запросом и получаем некую табличку с информацией, поля в таблице:

  • table - таблица в которую обращается запрос
  • type - тип связывания с таблицей, об это подробние чуть ниже
  • possible_keys - возможные индексы которые могут быть использованы в запросе
  • key - содержит индекс который задействовал mysql
  • key_len - некая длинна ключа, для чего она предназначена, для меня пока тайна.
  • ref - тут отображается данные которые были использованы ключем для выборки.
  • rows - количество строк которое mysql перебирает в время выполнения запроса
  • Extra - тут отображается пояснение о том как будет выполнятся запрос, для себя применения информации из этого столбца не открыл, возможно где-то что-то упустил.

Теперь о типах связывания с таблицей:

  • system - системная таблица содержащая только одну строку, это частный случай связывания const.
  • const - таблица содержит только одну запись соответствующую запросу
  • eq_ref - используется когда строки выбираются по индекусу ( UNIQUE или PRIMARY, т.е. индексу соответствует одна строка ).
  • ref - используется когда строки выбираются по индексу ( не UNIQUE или PRIMARY, т.е. индексу могут соответствовать несколько строк ).
  • range - используется когда выбираются по индексу в заданном диапазоне
  • index - некий тип связывания который аналогичен ALL, только обычно чуть быстрее него. В чем конкретно разница, я не стал вдаваться.
  • ALL - для выборки производится полный перебор строк таблицы

Обратите внимание что типы расположены от лучше к худшему по убыванию. Приемлемыми можно считать ref и выше него, возможно и range в некоторых ситуациях, но у меня пока такого не было.

Итак получили мы нашу табличку и смотрим на параметра type, key и rows, какой используется тип связывания, какой ключ использовался при запросе и сколько строк пришлось обработать. Если поле ключа у нас пустует то это не есть хорошо и вероятно type нас тоже не устроит, поэтому требуется создать ключ в таблице к которой обращаются. После создания ключа который начнет использовать запрос смотрим на type и rows, если type = range или ниже по списку, или rows в разы больше чем количество строк полученных на выходе, то надо чтото делать с нашим запросом. Это довольно объемная тема в которой я еще сам довольно сильно плаваю и учусь методом проб и ошибок, но следуют обратить внимание на то что возможно создать более подходящий ключ для нужд запроса, а так же изменить конструкцию запроса. В последнем очень много нюансов, в котором поможет документация по mysql. Возможно когда-то я попробую подбить информацию по этому вопросу, а пока буду его потихоньку изучать.

Собственно данной статьей я хотел донести до вас что есть команда explain которая может вам существенно помчь в оптимизации запросов к базе, а также попробовал изложить понимание данной команды своими словами, поскольку в документации она изложена достаточно сухо, и некоторые моменты для меня все еще мало понятны. Данная статья не претендует на истину в высшей инстанции, но как вводная для ознакомления работы с explain думаю может пригодится. Обоснованная критика как всегда приветсвуется.

Теги:

Автор: 
Форостяненко Сергей Юрьевич aka Fox

Комментарии

Аватар пользователя Fastto

Extra - одна из важнейших частей.
Описание можно найти тут - http://www.mysql.ru/docs/man/EXPLAIN.html