EXPLAIN может в точности рассказать вам, что происходит, когда вы выполняете запрос. Эта информация позволит вам обнаружить медленные запросы и сократить время, затрачиваемое на обработку запроса, что впоследствии может значительно ускорить работу вашего приложения.
2) Применение оператора EXPLAIN перед SELECT запросами.
Рассмотрим второй способ. Простейший пример использования:
EXPLAIN SELECT * FROM student WHERE idStudent = 2;
В этом примере производится выборка данных студента на основе его идентификатора (idStudent). Вот то, что мы имеем в результате выполнения запроса EXPLAIN:
Id: Идентификатор (ID) таблицы в запросе. EXPLAIN создает по одной записи для каждой таблицы в запросе.
Select_type: simple. Возможные значения: SIMPLE, PRIMARY, UNION, DEPENDENT UNION, SUBSELECT, и DERIVED. Это тип запроса.
· SIMPLE – обычный тип запроса SELECT.
· PRIMARY – внешний (первый) запрос, в котором используются подзапросы и соединения.
· UNION – второй или последний запрос в соединении
· DEPENDENT UNION - второй или последний запрос в соединении, зависящий от первичного запроса
· SUBQUERY – внутренний подзапрос.
· DEPENDENT SUBQUERY – внутренний подзапрос, зависящий от первичного запроса
· DERIVED – подзапрос, использованный в выражении FROM.
Table. Имя таблицы, из которой MySQL читает данные.
Type. Тип объединения, которое использует MySQL. Возможные значения: eq_ref, ref, range, index, или all. (const – таблица в запросе считывается только однажды)
Possible_keys. Список индексов (или NULL, если индексов нет), которые MySQL может использовать для выборки рядов в таблице.
Key. Название индекса, который использует MySQL (после проверки всех возможных индексов).
Key_len. Размер ключа в байтах.
Ref. Колонки или значения, которые используются для сравнения с ключем.
Rows. Количество рядов, которые MySQL необходимо проверить, для обработки запроса(!)
Extra. Дополнительная информация о запросе.
Этот пример достаточно прост. Мы производим поиск по первичному ключу (idStudent) и может быть только одна запись, которая подойдет нашим условиям (переменная rows равна 1).
Рассмотрим более расширенный пример. Создадим еще одну таблицу address, содержащую место проживания студентов.
EXPLAIN SELECT *
FROM student
INNER JOIN ADDRESS
ON student.idStudent = address.user
WHERE student.idStudent = 1;
Наблюдаем результат, и видим, что во второй таблице не используется индекс, и она просматривается вся при соединении. При большом количестве данных это очень критично.
Добавим индекс во вторую таблицу для поля user.
ALTER TABLE address ADD INDEX (user);
Наблюдаем результат:
Теперь поле проиндексировано и просматривается всего лишь 1 запись из присоединяемой таблицы.