Небольшой разбор синтаксиса инструкции EXPLAIN в MySQL. EXPLAIN используется для анализа медленных запросов.
Если перед оператором SELECT стоит ключевое слово EXPLAIN, то MySQL выведет данные о том, как будет проведена выборка и отобразит полную информацию о методе и порядке связывания таблиц. EXPLAIN поможет выяснить — стоит ли снабдить исследуемые таблицы индексами (чтобы запросы тратили меньше ресурсов). и проверить, насколько удачно существующие ключи связывают таблицы.
Пример:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mysql> <strong>SELECT * FROM countries</strong> WHERE<strong> currency_code='PHP';</strong> +------------+-----------+---------------+-------------------+ | country_id | name      | currency_code | currency          | +------------+-----------+---------------+-------------------+ |        206 | Филиппины | PHP           | Филиппинское песо | +------------+-----------+---------------+-------------------+ 1 row in set (0.00 sec) mysql> EXPLAIN SELECT * FROM countries WHERE currency_code='PHP'; +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra       | +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ |  1 | SIMPLE      | countries | ALL  | NULL          | NULL | NULL    | NULL |  230 | Using where | +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ 1 row in set (0.00 sec) | 
Особое внимание — на колонку key, так как в ней должно быть название индекса который использовался Mysql для данной выборки. Колонка rows отображает количество обработанных строк, которое было обработано за данный запрос. Значение должно находится в пределах десятков или нескольких сотен.
Ещё один пример запроса, где для поиска использовался первичный ключ — PRIMARY , а число обработанных строк — 10.
| 1 2 3 4 5 6 7 | mysql> EXPLAIN SELECT * FROM countries WHERE country_id>200 AND country_id<210; +----+-------------+-----------+-------+---------------+---------+---------+------+------+-----------------------+ | id | select_type | table     | type  | possible_keys | key     | key_len | ref  | rows | Extra                 | +----+-------------+-----------+-------+---------------+---------+---------+------+------+-----------------------+ |  1 | SIMPLE      | countries | range | PRIMARY       | PRIMARY | 4       | NULL |   10 | Using index condition | +----+-------------+-----------+-------+---------------+---------+---------+------+------+-----------------------+ 1 row in set (0.17 sec) | 
Пример медленного запроса:
| 1 2 3 4 5 6 7 8 | mysql> EXPLAIN SELECT * FROM countries WHERE currency_code LIKE 'akadabra'; +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra       | +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ |  1 | SIMPLE      | countries | ALL  | NULL          | NULL | NULL    | NULL |  230 | Using where | +----+-------------+-----------+------+---------------+------+---------+------+------+-------------+ 1 row in set (1.97 sec) | 
Ключа нет, а количество просмотренных строк = кол-ву полей в таблице — отсюда и большое время выполнения запроса.
В большинстве случаев длительность выполнения запроса достаточно большая из-за отсутствия индекса по искомому полю.
Полный синтаксис и вывод EXPLAIN можно посмотреть тут.
Очень простой пример использования, более сложный пример и улучшение запросов: https://habrahabr.ru/post/211022/

 
																								
Свежие комментарии