Предисловие: В этой статье в основном говорится о том, как использовать объяснение, а также о концепции различных параметров объяснения, а затем речь пойдет об оптимизации.
1. Объясните использование
Смоделируйте, как оптимизатор Mysql выполняет операторы запросов SQL, чтобы узнать, как Mysql обрабатывает ваши операторы SQL. Проанализируйте структуру запроса или таблицы на наличие узких мест в производительности.
Синтаксис: объяснение + оператор SQL;
Такие как: Объясните выбор * от пользователя; Будут сгенерированы следующие результаты анализа SQL, и каждое поле будет подробно объяснено ниже.
2. идентификатор
Это набор чисел, представляющий порядок запроса между несколькими таблицами или порядок в операторе запроса, содержащем предложение.Идентификатор разделен на три случая, которые подробно объясняются по порядку.
- ID тот же, порядок выполнения сверху вниз
- Идентификатор другой.Если это подзапрос, номер идентификатора будет увеличиваться.Чем больше значение идентификатора, тем выше приоритет и выполняться первым.
- Один и тот же идентификатор и разные случаи существуют одновременно
Три, select_type
select_type содержит следующие значения
- simple
- primary
- subquery
- derived
- union
- union result
simple
Простой запрос на выборку, не содержащий подзапросов или запросов на объединение.
primary
Если оператор SQL содержит какие-либо подзапросы, самый внешний подзапрос будет помечен как первичный.
subquery
Если подзапрос включен в select или where, то подзапрос будет помечен как subQquery, что появляется одновременно с 3.2
derived
Подзапросы, содержащиеся в from, будут помечены как производные запросы, а результаты запроса будут помещены во временную таблицу.
union / union result
Если есть два оператора запроса выбора, и они запрашиваются объединением, второй выбор будет помечен как объединение, а результат объединения будет отмечен как результат объединения. его идентификатор нулевой
Четыре, стол
Указывает, к какой таблице принадлежат данные этой строки
Пять, тип
Тип показывает, какой тип индекса использует MySQL.Эффективность запросов разных типов индексов также отличается.Тип примерно имеет следующие типы
- system
- const
- eq_ref
- ref
- range
- index
- all
system
В таблице всего одна строка записей, system — это частный случай const, чего почти никогда не бывает и его можно игнорировать
const
Поместите индекс первичного ключа или уникальный индекс в условие запроса where, MySQL может превратить условие запроса в константу, сопоставить только одну строку данных, и индекс найдет данные один раз.
eq_ref
В запросе с несколькими таблицами, таком как T1 и T2, строка записей в T1 может найти только уникальную строку в T2, Грубо говоря, условия для связанного запроса T1 и T2 являются индексом первичного ключа. или уникальный индекс, чтобы гарантировать, что T1 Каждая строка записей соответствует только одной строке T2
В качестве неуместного примера EXPLAIN SELECT * from t1, t2, где t1.id = t2.id
ref
Это не индекс первичного ключа, не уникальный индекс и не обычный индекс, который может возвращать несколько подходящих строк.
range
Это отражается в интервальном поиске индекса, который обычно появляется при поиске в диапазоне, таком как между, и, и в условии где.
index
Пройдитесь по всем деревьям индексов, чтобы найти строки, соответствующие условиям. Файл индекса по-прежнему намного меньше файла данных, поэтому он по-прежнему намного быстрее, чем полное сканирование таблицы без индекса.
all
Индекс не используется, просто просмотрите все данные таблицы, чтобы найти данные, соответствующие условиям.
Шесть, возможные_ключи
Если для поля, задействованного в этом запросе, есть индекс, он будет указан, указывая индекс, который может быть использован, но не индекс, который будет фактически использоваться.
Семь, ключ
Индекс, фактически используемый в этом запросе
Восемь, key_len
Указывает количество байтов, используемых в индексе. С помощью этого свойства можно узнать длину индекса, используемого в запросе. Примечание. Это максимально возможная длина, а не фактическая длина. Без потери точности, чем короче длина , эффективность запросов выше
Девять, исх.
Отображает связанные поля. Если используется постоянный запрос эквивалентности, отображается const, а если это запрос соединения, отображается связанное поле.
- Таблица tb_emp представляет собой сканирование неуникального индекса, а фактически используемый индексный столбец — idx_name.Поскольку tb_emp.name='rose' является константой, ref=const.
- tb_dept — это сканирование уникального индекса.Из оператора sql видно, что фактически используется индекс первичного ключа PRIMARY.ref=db01.tb_emp.deptid указывает, что поле deptid таблицы tb_emp в базе данных db01 связано.
Десять, ряды
В соответствии со статистикой данных таблицы и использованием индекса приблизительно оцените количество строк, которые необходимо прочитать, чтобы найти нужные записи. Чем меньше строк, тем лучше.
Одиннадцать, доп.
Не подходит для отображения в других колонках, но важная информация для оптимизации
использование fileSort (ключевая оптимизация)
Обычно известная как «сортировка файлов», когда объем данных велик, это почти «при смерти».В процессе сортировки или группировки по сортировке поле порядка не является полем индекса или существование поле запроса выбора не является полем индекса или запросом выбора. Все поля являются полями индекса, но порядок по полям и порядок поля индекса выбора несовместимы, что приведет к сортировке файла.
использование временного (ключевая оптимизация)
Временные таблицы используются для хранения промежуточных результатов, которые обычно упорядочиваются и группируются.
ИСПОЛЬЗОВАНИЕ индекса (выделение)
Указывает, что в соответствующей операции выбора используется покрывающий индекс (Coveing Index), чтобы избежать доступа к строкам данных таблицы, и эффективность хорошая! Если используется в то же время, это указывает, что индекс используется для выполнения поиска значения ключа индекса; если используется в то же время, где нет, поверхностный индекс используется для чтения данных, а не для выполнения операций поиска. .
Using wher
Указывает, что там, где используется фильтрация
using join buffer
используется кеш соединения
impossible where
Значение предложения where всегда ложно и не может использоваться для получения каких-либо кортежей.
select tables optimized away
Оптимизация операций MIN/MAX на основе индекса без предложения GROUPBY или Чтобы подсистема хранения MyISAM оптимизировала операцию COUNT(*), нет необходимости ждать этапа выполнения для расчета, Оптимизация завершается на этапе формирования плана выполнения запроса.
distinct
Оптимизировать разные, перестать находить одно и то же значение после нахождения первого совпадающего кортежа
В следующей статье речь пойдет о том, как оптимизировать индексы MySQL.
Обратите внимание на публичный аккаунт WeChat: IT-брат
Ответ: полный набор учебных пособий по Java, которые вы можете получить: основы Java, веб-приложение Java, все учебные пособия по JavaEE, включая весеннюю загрузку и т. д.
Re: Шаблон резюме, вы можете получить 100 красивых резюме
Re: Маршрут обучения Java, вы можете получить самую последнюю и самую полную дорожную карту обучения
Re: Java eBook, вы можете получить 13 обязательных к прочтению книг для лучших программистов