В MySQL мы можем передатьEXPLAINКоманда для получения информации о том, как MySQL выполняет оператор SELECT, включая способ соединения таблиц и порядок, в котором они соединяются во время выполнения оператора SELECT.
Ниже приведеныEXPLAINКаждый столбец результата команды описан:
-
select_type: Указывает тип SELECT.Обычные значения:
тип инструкция SIMPLE Простая таблица без объединений таблиц или подзапросов PRIMARY Основной запрос, внешний запрос UNION Второй или последующий оператор запроса в UNION SUBQUERY первый в подзапросе table: Таблица выходного набора результатов (псевдоним таблицы)
-
type: Указывает способ, которым MySQL находит нужную строку в таблице, или тип доступа. Общие типы доступа следующие, сверху вниз, от плохого к лучшему:
ALL полное сканирование таблицы index полное сканирование индекса range сканирование диапазона индекса ref сканирование неуникального индекса eq_ref сканирование уникального индекса const,system Одна таблица имеет не более одной совпадающей строки NULL Нет необходимости сканировать таблицы или индексы -
type=ALL, полное сканирование таблицы, MySQL просматривает всю таблицу, чтобы найти совпадающие строки
Как правило, условие «где» отсутствует или условие «где» не использует оператор запроса индекса.
EXPLAIN SELECT * FROM customer WHERE active=0;
-
type=index, полное сканирование индекса, MySQL просматривает весь индекс для запроса совпадающих строк и не сканирует таблицу
Как правило, поле запроса имеет индекс в операторе запроса.
EXPLAIN SELECT store_id FROM customer;
-
type=range, сканирование диапазона индексов, обычно используется для , >=, между и другими операциями
EXPLAIN SELECT * FROM customer WHERE customer_id>=10 AND customer_id<=20;
Обратите внимание, что сравниваемые поля в этом случае должны быть проиндексированы.Если индекса нет, MySQL выполнит полное сканирование таблицы.В следующем случае поле create_date не индексируется:
EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13' ;
-
type=ref, используя сканирование префикса неуникального индекса или уникального индекса, возвращает строки, соответствующие одному значению
store_id
Поле имеет нормальный индекс (неуникальный индекс)EXPLAIN SELECT * FROM customer WHERE store_id=10;
refТипы также часто появляются в операциях соединения:
customer,paymentЗапрос ассоциации таблицы, связанные поля
customer.customer_id
(первичный ключ),payment.customer_id
(неуникальный индекс). Когда таблица связана с запросом, должна быть таблица для полного сканирования таблицы.Эта таблица должна быть таблицей с наименьшим количеством строк в нескольких таблицах, а затем неуникальный индекс используется для поиска совпадающих строк в других связанных таблицах. , чтобы сканировать строки, когда таблица связана с наименьшим числом.так какcustomer,paymentв двух таблицахcustomerВ таблице наименьшее количество строк, поэтомуcustomerполное сканирование таблицы,paymentТаблица ищет совпадающие строки по неуникальному индексу.
EXPLAIN SELECT * FROM customer customer INNER JOIN payment payment ON customer.customer_id = payment.customer_id;
-
type=eq_ref, аналогично ref, разница в том, что используемый индекс является уникальным индексом, для каждого значения ключа индекса соответствует только одна запись в таблице
eq_refКак правило, первичный ключ или уникальный индекс используются в качестве условия ассоциации при соединении нескольких таблиц.
фильм, фильм_текстЗапрос ассоциации таблицы в основном такой же, как и предыдущий, за исключением того, что условие ассоциации изменено с неуникального индекса на первичный ключ.
EXPLAIN SELECT * FROM film film INNER JOIN film_text film_text ON film.film_id = film_text.film_id;
-
type=const/system, в одной таблице есть не более одной совпадающей строки, а запрос выполняется очень быстро, поэтому значения других столбцов этой совпадающей строки могут быть обработаны оптимизатором как константы в текущем запросе
const/systemПоявляется в запросах на основе первичного ключа или уникального индекса
Запрос на основе первичного ключа:
EXPLAIN SELECT * FROM customer WHERE customer_id =10;
Запрос на основе уникального индекса уникального индекса:
EXPLAIN SELECT * FROM customer WHERE email ='MARY.SMITH@sakilacustomer.org';
-
type=NULL, MySQL может получить результат напрямую, не обращаясь к таблице или индексу.
-
possible_keys: указывает индекс, который может использовать запрос.
key: фактический используемый индекс
key_len: использовать длину поля индекса
ref: какой столбец или константу использовать с ключом для выбора строк из таблицы.
rows: количество строк сканирования
filtered: после того, как данные, возвращенные механизмом хранения, отфильтрованы на уровне сервера, пропорция (процент) числа оставшихся записей, удовлетворяющих запросу
-
Extra: Описание и описание выполнения, включая дополнительную информацию, которая не подходит для отображения в других столбцах, но важна для плана выполнения.
Есть три основных:
Using Index Указывает покрытие индекса и не будет возвращаться к таблице для запроса Using Where Указывает, что был сделан запрос формы возврата Using Index Condition Указывает, что выполняется оптимизация ICP Using Flesort Указывает, что MySQL нуждается в дополнительных операциях сортировки, и эффект сортировки не может быть достигнут с помощью порядка индекса.
Что такое ИКП?
В MySQL 5.6 появилась функция **Index Condition Pushdown (ICP)** для дальнейшей оптимизации запроса. Pushdown означает, что операция децентрализована, а в некоторых случаях операция условной фильтрации децентрализована для механизма хранения.
EXPLAIN SELECT * FROM rental WHERE rental_date='2005-05-25' AND customer_id>=300 AND customer_id<=400;
До версии 5.6:
Оптимизатор сначала использует составной индекс idx_rental_date, чтобы отфильтровать подходящиеrental_date='2005-05-25'
записей, а затем вернуть записи в таблицу по составному индексу idx_rental_date, и, наконец, по условиямcustomer_id>=300 AND customer_id<=400
Отфильтруйте результат последнего запроса (выполняется на уровне сервиса).
После версии 5.6:
MySQL использует ICP для дальнейшей оптимизации запроса, при извлечении ставить условиеcustomer_id>=300 AND customer_id<=400
Он также передается на уровень механизма хранения для завершения фильтрации, что может уменьшить ненужный доступ к операциям ввода-вывода. Экстра этоUsing index condition
Это означает, что используется оптимизация ICP.
Ссылаться на
«Углубленный MySQL»
-----END-----
Друзья, которым понравилась эта статья, приглашаем отсканировать картинку ниже и обратить внимание на публичный аккаунт.Закодируйте эти вещи, смотрите больше захватывающего контента