Обмен технологиями

Подробное объяснение оператора Mysql и отображение примера

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Сначала кратко представим sql:

Язык SQL разделен на четыре категории: язык запросов данных DQL, язык манипулирования данными DML, язык определения данных DDL и язык управления данными DCL.

1. Язык запросов данных DQL
Базовая структура языка запросов данных DQL представляет собой блок запроса, состоящий из предложения SELECT, предложения FROM и предложения WHERE: SELECT <имя поля таблицы> FROM <имя таблицы или представления> WHERE <условия запроса>

2. Язык манипулирования данными DML
Существует три основные формы языка манипулирования данными DML:
1) Вставка: ВСТАВКА
2) Обновление: ОБНОВЛЕНИЕ
3) Удалить: УДАЛИТЬ

3. Язык определения данных DDL
Язык определения данных DDL используется для создания различных объектов в базе данных ----- таблиц, представлений, индексов, синонимов, кластеров и т. д., таких как: CREATE TABLE / VIEW / INDEX / SYN / CLUSTER Кластер синонимов индекса табличного представления | . Операции DDL выполняются неявно! Невозможно выполнить откат

4. Язык управления данными DCL
Язык управления данными DCL используется для предоставления или отзыва определенных привилегий для доступа к базе данных, управления временем и эффектом транзакций манипулирования базой данных, а также мониторинга базы данных. нравиться:
1) ГРАНТ: Авторизация.
2) ОТКАТ [РАБОТЫ] ДО [SAVEPOINT]: Откат до определенной точки. Откат ---ROLLBACK Команда отката возвращает состояние базы данных к последнему отправленному состоянию. Его формат: SQL>ROLLBACK;
3) COMMIT [РАБОТА]: Отправить. Во время операций вставки, удаления и изменения базы данных транзакция завершается только после ее отправки в базу данных. До того, как транзакция будет зафиксирована, только тот, кто управляет базой данных, имеет право видеть, что было сделано. Остальные смогут увидеть это только после завершения окончательной фиксации.

О заявлениях авторизации

Команда авторизации базы данных:

GRANT<разрешение> для имени таблицы (или имени столбца) пользователю

Правильный вариант ответа B: вставить, выбрать: имя таблицы разрешений: пользователь пользователь: nkw

Дополнительные очки знаний – разрешения на переработку

REVOKE <разрешение> для имени таблицы (или имени столбца) ОТ пользователя

Объясните введение утверждения

Я думаю, что все знакомы с оператором объяснения, который используется для просмотра плана выполнения. Объяснение часто используется в анализе оптимизации SQL.

Здесь стоит отметить: объяснение фактически не выполняет оператор, а лишь отображает план выполнения.

Какую информацию я могу увидеть?

  • Порядок чтения таблицы
  • Тип операции чтения данных
  • Какие индексы можно использовать
  • Какие индексы на самом деле используются
  • Ссылки между таблицами
  • Сколько строк в каждой таблице запрашивается оптимизатором

Введение в базовый синтаксис

  1. EXPLAIN SELECT select具体语句
  2. 如:
  3. EXPLAIN SELECT * FROM userpro

объяснить функцию каждого столбца

СписокописыватьПополнить
идентификаторКаждое ключевое слово SELECT соответствует идентификатору

выберите_тип

Тип запроса, соответствующий ключевому слову SELECT
столИмя таблицы
перегородкиСоответствующая информация о разделах
типМетод доступа для одной таблицы
возможные_ключиВозможные индексы
ключфактический используемый индекс
key_lenФактическая длина используемого индекса
ссылкаПри использовании запроса на эквивалентность столбца индекса — информация об объекте, которая соответствует столбцу индекса на предмет эквивалентности.
рядыПредполагаемое количество записей, которые необходимо прочитать
отфильтрованоПроцент оставшихся записей после фильтрации по критериям поиска

    

Дополнительный

Дополнительная информация

               

Подробное описание каждого столбца EXPLAIN.

1,идентификатор

Каждое ключевое слово SELECT соответствует идентификатору

Чем больше значение id, тем выше приоритет и оно будет выполнено в первую очередь.

Если идентификаторы одинаковы, их можно рассматривать как группу и выполнять последовательно сверху вниз.

Каждый идентификационный номер представляет собой независимый запрос. Чем меньше запросов в операторе SQL, тем лучше.

2,выберите_тип

категорияиллюстрировать
ПРОСТОЙЗапрос одной таблицы, без подзапроса или запроса UNION.
НАЧАЛЬНЫЙСамый внешний оператор SELECT в запросе.
ПОДЗАПРОСВ предложении WHERE используется подзапрос.
ПОЛУЧЕННЫЙДля подзапросов, содержащихся в предложении FROM, MySQL помечает его как DERIVED (производный) и генерирует временную таблицу для своего набора результатов для использования внешним запросом.
СОЮЗВторой и последующие операторы запроса в запросе UNION.
РЕЗУЛЬТАТ СОЮЗАРезультирующий набор запроса UNION.
ЗАВИСИМЫЙ ПОДЗАПРОСРезультат подзапроса зависит от значения внешнего запроса, и подзапрос выполняется один раз для каждой строки внешнего запроса.
ЗАВИСИМЫЙ СОЮЗВторой и последующие операторы запроса UNION, а результаты зависят от значения внешнего запроса.
НЕКЭШИРУЕМЫЙ ПОДЗАПРОСПодзапрос не может быть кэширован и будет выполняться каждый раз, когда на него ссылаются.

3. Столбец таблицы представляет имя таблицы (иногда это не настоящее имя таблицы, это может быть аббревиатура).

4. перегородки (по желанию)

5. тип ☆

Общие типы следующие:

типиллюстрировать
системаВ таблице обычно только одна строка SELECT ... FROM DUAL Оптимизация запросов.
константаЗапрос находится по индексу один раз, имея только одну строку результатов (таблица констант).
eq_refИспользуйте уникальный индекс или первичный ключ, чтобы найти строку из другой таблицы.
ссылкаИспользуйте неуникальный индекс, чтобы найти одну или несколько строк из другой таблицы.
диапазонВозвращает диапазон строк, используя индекс.
индексПолностью сканирует индекс для поиска строк, а не сканирует всю таблицу.
всеПри полном сканировании таблицы проверяется каждая строка таблицы.

В общем, старайтесь избегать всего

6, ключ и возможные_ключи

  1. ключ

    • key Поле показывает фактический индекс, используемый запросом.Если значение этого поляNULL , что указывает на то, что индекс не используется. Если это поле имеет значение, это означает, что MySQL использовал указанный индекс для выполнения запроса.
  2. возможные_ключи

    • possible_keys Поле отображает список индексов, которые MySQL может использовать. Эти индексы — это индексы, которые могут учитываться в запросах, но фактически не могут использоваться. обычно,possible_keys Перечисленные индексы определяются на основе условий запроса и структуры таблицы.
  • если key Поле имеет индексное имя иpossible_keys В списке перечислены несколько имен индексов, что указывает на то, что MySQL выбралkey Индекс, в котором указано поле, используется для выполнения запроса, а остальные индексы перечислены в списке.possible_keys Medium заявил, что его также можно рассмотреть, но в конечном итоге не использовать.

  • если key ПоляNULLpossible_keys Несколько имен индексов перечислены в , что указывает на то, что MySQL не использует какой-либо индекс при выполнении запроса, что может привести к полному сканированию таблицы или другим методам доступа, не оптимизированным по индексу.

7, key_len

key_len Поле, описывающее длину индексного ключа. Он указывает использование индекса и длину индексного ключа, когда MySQL использует определенный индекс для выполнения запросов.

  1. Индекс одного столбца

    • Если используется один индекс столбца и тип столбца имеет фиксированную длину (например, INT),но key_len Значение представляет собой длину столбца.
    • Если используются поля переменной длины (например. VARCHAR),но key_len Значение — максимальная длина поля.
  2. составной индекс

    • Для составных индексов (то есть индексов, содержащих несколько столбцов)key_len Представляет общую длину всех столбцов в индексе.
  3. комбинированный индекс

    • Если в запросе используется комбинированный индекс по нескольким столбцам,key_len — общая длина всех столбцов в объединенном индексе.
  4. индексный префикс

    • В некоторых случаях MySQL может использовать только часть индекса. Например, вы можете использовать префикс индекса как часть индекса для выполнения запроса. в этом случае,key_len Будет показана фактическая длина используемой индексной части.

8, ссылка

ref Это поле, которое описывает условия соединения между таблицами или использует для поиска неуникальный индекс. Он указывает, какие условия соединения или какие индексы MySQL использует для доступа к таблице при выполнении запроса.

9, ряды

rows Это оценка количества строк, к которым осуществляется доступ или которые проверяются при выполнении запроса.

  • для простого SELECT Спросите,rows Представляет предполагаемое количество возвращаемых строк.
  • Для запросов на объединение (JOIN) или подзапрос,rows Может представлять количество строк, к которым осуществляется доступ во время операции соединения.
  • Для сканирования таблицы (полное сканирование таблицы или сканирование индекса):rows Может представлять количество просканированных строк.

10, отфильтровано

Представляет процент строк, отфильтрованных на основе условий WHERE и условий индекса. filtered отражает эффект оптимизации запроса, оцененный оптимизатором.

когда filtered Когда оно близко к 100 %, это означает, что условия запроса эффективно отфильтровали большинство строк, не соответствующих условиям, что обычно является хорошим показателем оптимизации.

Напротив, если filtered Низкое значение может указывать на то, что условия запроса недостаточно точны или что оптимизатор неэффективно использует индекс для фильтрации данных.

11,Экстра

Дополнительные информационные поля

Вот некоторые распространенные Extra Поля и их значения:

  1. Использование индекса

    • Указывает, что запрос использует покрывающий индекс, то есть результаты запроса могут быть полностью возвращены через индекс без доступа к фактическим строкам данных таблицы.
  2. Используя где

    • Указывает, что сервер MySQL будет выполнять условную фильтрацию после того, как механизм хранения получит строки, а не завершит ее в индексе.
  3. Использование временных

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

    • Указывает, что MySQL выполнил сортировку файлов для обработки запроса. Обычно это происходит, когда сортировку невозможно выполнить с помощью индекса.
  5. Диапазон проверяется для каждой записи (карта индекса: ...)

    • Указывает, что MySQL использует индекс для проверки того, находится ли каждая запись в указанном диапазоне.Обычно это происходит, когдаrange В типе запроса.
  6. Полное сканирование по ключу NULL

    • Указывает, что MySQL выполнил полное сканирование таблицы в индексе, чтобы найти строки, соответствующие значениям NULL.
  7. Отчетливый

    • Указывает, что MySQL прекратит поиск повторяющихся строк после обнаружения первой совпадающей строки.
  8. Использование буфера соединения (блочный вложенный цикл)

    • Указывает, что MySQL использует буфер соединения для обработки операции соединения. Обычно это происходит, когда количество таблиц соединений велико или размер таблицы соединений велик.
  9. Невозможно ГДЕ

    • Указывает, что оптимизатор MySQL определил, что условия предложения WHERE не могут быть удовлетворены, и поэтому строки сканироваться не будут.
  10. Таблицы не используются

    • Указывает, что запрос не задействует какие-либо таблицы, например SELECT NOW()

объяснить фактическое отображение выполнения

подготовка данных

Создать таблицу s1

  1. CREATE TABLE s1 (
  2. id INT AUTO_INCREMENT,
  3. key1 VARCHAR(100),
  4. key2 INT,
  5. key3 VARCHAR(100),
  6. key_part1 VARCHAR(100),
  7. key_part2 VARCHAR(100),
  8. key_part3 VARCHAR(100),
  9. common_field VARCHAR(100),
  10. PRIMARY KEY (id),
  11. INDEX idx_key1 (key1),
  12. UNIQUE INDEX idx_key2 (key2),
  13. INDEX idx_key3 (key3),
  14. INDEX idx_key_part(key_part1, key_part2, key_part3)
  15. ) ENGINE=INNODB CHARSET=utf8;

Создать таблицу s2

  1. CREATE TABLE s2 (
  2. id INT AUTO_INCREMENT,
  3. key1 VARCHAR(100),
  4. key2 INT,
  5. key3 VARCHAR(100),
  6. key_part1 VARCHAR(100),
  7. key_part2 VARCHAR(100),
  8. key_part3 VARCHAR(100),
  9. common_field VARCHAR(100),
  10. PRIMARY KEY (id),
  11. INDEX idx_key1 (key1),
  12. UNIQUE INDEX idx_key2 (key2),
  13. INDEX idx_key3 (key3),
  14. INDEX idx_key_part(key_part1, key_part2, key_part3)
  15. ) ENGINE=INNODB CHARSET=utf8;

Данные готовятся самостоятельно.

Пример выполнения и результаты

Простой запрос

Запрос одной таблицы

EXPLAIN SELECT * FROM `s1`;

Присоединиться к запросу

EXPLAIN SELECT * FROM `s1` INNER JOIN `s2`;

подзапрос

  1. EXPLAIN SELECT * FROM s1 WHERE key1 IN (SELECT key2 FROM s2 WHERE common_field
  2. = 'a');

специальный дисплей

показать select_type
  1. #Union 去重
  2. EXPLAIN SELECT * FROM `s1` UNION SELECT * FROM `s2`;
  3. #Union 全查
  4. EXPLAIN SELECT * FROM `s1` UNION ALL SELECT * FROM `s2`;

Последний шаг — дедупликация, поэтому будет использоваться временная таблица. Однако UNION ALL — это запрос для всех, и сообщение запроса временной таблицы не появится.

тип класса

const (найти индекс один раз, только одна строка результатов)

EXPLAIN SELECT * FROM s1 WHERE id = 10002;

eq_ref (найти строку из другой таблицы, используя уникальный индекс или первичный ключ)

EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;

ref (используйте неуникальный индекс для поиска одной или нескольких строк из другой таблицы)

EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';

диапазон (возвращает диапазон строк с использованием индекса)

EXPLAIN SELECT * FROM s1 WHERE key1 IN ('a', 'b', 'c');

индекс (полное сканирование индекса для поиска строк)

EXPLAIN SELECT key_part2 FROM s1 WHERE key_part3 = 'a';

Другие дисплеи

фильтрованное десятичное время

EXPLAIN SELECT * FROM s1 WHERE key1 > 'za' AND common_field = 'la'