Небольшой разбор синтаксиса инструкции 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/
Свежие комментарии