MySQL - Анализ плана выполнения SQL через EXPLAIN

задняя часть MySQL сервер SQL

В MySQL мы можем передатьEXPLAINКоманда для получения информации о том, как MySQL выполняет оператор SELECT, включая способ соединения таблиц и порядок, в котором они соединяются во время выполнения оператора SELECT.

mark

Ниже приведеныEXPLAINКаждый столбец результата команды описан:

  • select_type: Указывает тип SELECT.Обычные значения:

    тип инструкция
    SIMPLE Простая таблица без объединений таблиц или подзапросов
    PRIMARY Основной запрос, внешний запрос
    UNION Второй или последующий оператор запроса в UNION
    SUBQUERY первый в подзапросе
  • table: Таблица выходного набора результатов (псевдоним таблицы)

  • type: Указывает способ, которым MySQL находит нужную строку в таблице, или тип доступа. Общие типы доступа следующие, сверху вниз, от плохого к лучшему:

    ALL полное сканирование таблицы
    index полное сканирование индекса
    range сканирование диапазона индекса
    ref сканирование неуникального индекса
    eq_ref сканирование уникального индекса
    const,system Одна таблица имеет не более одной совпадающей строки
    NULL Нет необходимости сканировать таблицы или индексы
    1. type=ALL, полное сканирование таблицы, MySQL просматривает всю таблицу, чтобы найти совпадающие строки

      Как правило, условие «где» отсутствует или условие «где» не использует оператор запроса индекса.

      EXPLAIN SELECT * FROM customer WHERE active=0;

      mark

    2. type=index, полное сканирование индекса, MySQL просматривает весь индекс для запроса совпадающих строк и не сканирует таблицу

      Как правило, поле запроса имеет индекс в операторе запроса.

      EXPLAIN SELECT store_id FROM customer;

      mark

    3. type=range, сканирование диапазона индексов, обычно используется для , >=, между и другими операциями

      EXPLAIN SELECT * FROM customer WHERE customer_id>=10 AND customer_id<=20;

      mark

      Обратите внимание, что сравниваемые поля в этом случае должны быть проиндексированы.Если индекса нет, MySQL выполнит полное сканирование таблицы.В следующем случае поле create_date не индексируется:

      EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13' ;

      mark

    4. type=ref, используя сканирование префикса неуникального индекса или уникального индекса, возвращает строки, соответствующие одному значению

      store_idПоле имеет нормальный индекс (неуникальный индекс)

      EXPLAIN SELECT * FROM customer WHERE store_id=10;

      mark

      refТипы также часто появляются в операциях соединения:

      customer,paymentЗапрос ассоциации таблицы, связанные поляcustomer.customer_id(первичный ключ),payment.customer_id(неуникальный индекс). Когда таблица связана с запросом, должна быть таблица для полного сканирования таблицы.Эта таблица должна быть таблицей с наименьшим количеством строк в нескольких таблицах, а затем неуникальный индекс используется для поиска совпадающих строк в других связанных таблицах. , чтобы сканировать строки, когда таблица связана с наименьшим числом.

      mark

      так какcustomer,paymentв двух таблицахcustomerВ таблице наименьшее количество строк, поэтомуcustomerполное сканирование таблицы,paymentТаблица ищет совпадающие строки по неуникальному индексу.

      EXPLAIN SELECT * FROM customer customer INNER JOIN payment payment ON customer.customer_id = payment.customer_id;

      mark

    5. 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;

      mark

    6. type=const/system, в одной таблице есть не более одной совпадающей строки, а запрос выполняется очень быстро, поэтому значения других столбцов этой совпадающей строки могут быть обработаны оптимизатором как константы в текущем запросе

      const/systemПоявляется в запросах на основе первичного ключа или уникального индекса

      Запрос на основе первичного ключа:

      EXPLAIN SELECT * FROM customer WHERE customer_id =10;

      mark

      Запрос на основе уникального индекса уникального индекса:

      EXPLAIN SELECT * FROM customer WHERE email ='MARY.SMITH@sakilacustomer.org';

      mark

      mark

    7. type=NULL, MySQL может получить результат напрямую, не обращаясь к таблице или индексу.

      mark

  • 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.

mark

Ссылаться на

«Углубленный MySQL»


                                                       -----END-----


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