Расшифровка результатов запроса MySQL EXPLAIN для повышения производительности

Расшифровка результатов запроса MySQL EXPLAIN для повышения производительности

4 марта 2023 г.

MySQL является одной из наиболее часто используемых RDMS. Мы пишем различные типы запросов в MySQL. Некоторые из них были простыми, а некоторые — сложными, включающими даже более 4–5 таблиц. Когда мы пишем сложные запросы, важно понимать эффект запроса.

Иногда плохо написанные сложные запросы могут быть причиной низкой производительности базы данных. Мы можем использовать EXPLAIN, чтобы найти ключи, используемые в запросе, и то, как мы можем их оптимизировать.

Этот блог посвящен тому, как мы можем получить полезную информацию из результатов EXPLAIN.

Вывод «explain» содержит информацию о каждой таблице, используемой в запросе, и о порядке, в котором MySQL считывает таблицы при обработке запроса. Это означает, что MySQL считывает данные из таблицы, представленной в первой строке, затем находит соответствующую строку в таблице, представленной во второй строке, и так далее.

explain output

Столбцы, представляющие выходные данные EXPLAIN: id, select_type, table, partitions, возможных_keys, ключ, key_len, ref, rows, filtered, type и другие.

select_type: существуют разные типы выбора. В этом столбце показаны типы выбора. Существуют различные типы выборок: SIMPLE, UNION, SUBQUERY и DERIVED.

1.1 ПРОСТО. Выбор прост. Это означает, что здесь не используется подзапрос или объединение.

1.2 Подзапрос: любой запрос на выборку, используемый в другом запросе на выборку, но не в предложении FROM. Например, SELECT * FROM student_detail where address_key in (SELECT id from address where state = 'Karnataka');

subquery

1.3 DERIVED: запрос SELECT, используемый в предложении FROM другого запроса SELECT, является DERIVED select_type. Например,

ВЫБЕРИТЕ ИД ОТ (ВЫБЕРИТЕ * ОТ адреса) объявления;

derived

1.4 UNION. Второй запрос SELECT в UNION или последующий тип запроса SELECT — это UNION select_type. Например,

СОСТОЯНИЕ SELECT ОТ адреса, где id = 2 Состояние СОЕДИНЕНИЕ SELECT по адресу, где id = 4 Состояние СОЕДИНЕНИЕ SELECT по адресу, где id = 3;

union

таблица: имя таблицы. Это может быть имя таблицы или имя, предоставленное нами при запросе, или (производная таблица в строке с id vale n).

partitioned: раздел таблицы, из которого извлекаются данные. Если таблица не секционирована, то она показывает значение NULL, или может быть возможно, что этот столбец не присутствует в выходных результатах, если ни одна из таблиц не секционирована.

possible_keys: показывает все возможные индексы, из которых MySQL может использовать индекс для поиска строк в таблице. Но этот ключ не зависит от порядка таблицы в выходном результате, то есть он не зависит от порядка таблицы, в которой MySQL обрабатывает запрос. Поэтому вполне возможно, что ни один из ключей не используется. Я объяснил это ниже.

ключ: показывает фактический ключ, который используется для поиска строк в таблице. Обычно этот ключ был одним из ключей, представленных в возможных_ключах, но это может быть и другой ключ. Например, если он оптимизирован для извлечения всех необходимых столбцов из индекса напрямую с помощью сканирования индекса, MySQL может использовать сканирование индекса вместо сканирования строки данных.

key_len: показывает длину ключа, используемого для получения данных. Если ключ состоит из нескольких частей, то key_len помогает нам определить, сколько частей ключа multi_part используется для получения данных.

ref: указывает, какой столбец используется для столбца, присутствующего в ключе, для извлечения данных из таблицы. Оно также может быть константным, т. е. для сравнения используется константное значение. Например, SELECT * FROM student_detail sd INNER JOIN address ad ON sd.address_key = ad.id ГДЕ sd.id = 2. В этом запросе ключ, используемый в предложении JOIN, также присутствует в предложении where, и это означает, что мы получаем фиксированное количество строк, используя этот ключ из таблицы.

строки: указано приблизительное (не фактическое) количество строк, которые необходимо проверить.

отфильтровано: в столбце отфильтровано указано приблизительное процентное соотношение строк таблицы, отфильтрованных по условию таблицы. Максимальное значение равно 100, что означает отсутствие фильтрации строк. Значения, уменьшающиеся от 100, указывают на увеличение степени фильтрации. строки показывают предполагаемое количество проверенных строк, а строки × отфильтровано показывает количество строк, соединенных со следующей таблицей. Например, если строка равна 1000, а отфильтровано — 50,00 (50%), количество строк, которые нужно соединить со следующей таблицей, составляет 1000 × 50% = 500. Вы можете проверить официальный документ MySQL.

Я объясню использование столбцов type и extra в следующем блоге. И то, и другое требовало подробных объяснений, и одного блога для этого недостаточно.


Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE