Процесс выбора запроса

база данных MySQL

Обзор

Сегодня я начал кратко понимать некоторые базовые технологии mysql, вместо того, чтобы просто добавлять, удалять, изменять и проверять.

select * from  tab

Может быть, это самый простой кусок SQL в истории, и я не буду много говорить о том, что он означает.. Затем такой простой оператор отправляется от клиента к серверу MySQL, и как результат запроса возвращается с сервера пройти?такой процесс?
Толстяков не едят за один присест, поэтому я лишь кратко опишу шаги ниже и не буду вдаваться в конкретные детали реализации каждого шага. После подробностей я найду время, чтобы разобраться и опубликовать некоторые из моих собственных исследований.

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

Цифры на рисунке обозначают порядок выполнения в MySQL.

Соединитель

Как следует из названияСоединительОн отвечает за серверную обработку соединения между клиентом и сервером. Хорошо известно, что MySQL основан на TCP для взаимодействия команд, и эти соединения являются длинными соединениями, поэтому ими необходимо управлять. Если соединение долгое время бездействует, сервер будет активно закрывать эти соединения.Время по умолчанию 8 часов, и можно установить время ожидания. Вот почему существуют мультиплексированные пулы соединений и задаются размеры пулов соединений на стороне клиента.
Соединитель также выполняет проверку пользователей и разрешений для подключения.

Если все длительные соединения накапливаются, использование памяти может быть слишком большим, что будет принудительно уничтожено системой (OOM), что приведет к аварийному перезапуску MySQL. Решением может быть периодическое отключение длинных соединений.

кэш запросов

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

Хотя эффективность кеша будет очень высокой, частота попаданий кеша в большинстве случаев будет очень низкой, поскольку при выполнении операции обновления для таблицы все кеши запросов в этой таблице будут очищены.

Вы можете установить для параметра query_cache_type значение DEMAND, чтобы оператор SQL по умолчанию не запрашивал кеш, но вы можете использовать SQL_CACHE для отображения указанного кеша запросов следующим образом:

select SQL_CACHE * from tab;

Версия MySQL 8.0 напрямую удаляет функцию кэширования запросов! ! ! ![неловко смеется]

Анализатор

Если кеш не попал, здесь будет выполнен оператор SQL, и сервер проанализирует ваш SQL.
Сначала выполните «лексический анализ», чтобы идентифицировать все «слова», такие как «выбрать», «вставить», «обновить» и т. д., а также указать, имена столбцов и т. д. После завершения идентификации выполняется «анализ грамматики», чтобы определить, соответствует ли оператор SQL грамматике MySQL.Общие синтаксические ошибки укажут первое место, где произошла ошибка.

оптимизатор

Цель оптимизатора — сделать запросы более эффективными.
Работа оптимизатора будет выбирать, какой индекс использовать, когда в таблице несколько индексов; когда несколько таблиц связаны, определяет порядок ссылок для каждой таблицы. Обычно мы используем объяснение для просмотра плана выполнения при анализе оператора SQL, и здесь план выполнения — это то, что делает оптимизатор.

Актуатор

Исполнитель - это шаг, который фактически выполняет запрос. После анализа и оптимизации исполнитель выполнит запрос с наиболее эффективным планом.
Первый шаг исполнителя — определить, имеет ли пользователь право запрашивать таблицу.Если он не вернет ошибку напрямую, он откроет таблицу для продолжения выполнения, если это произойдет. Исполнитель фактически вызывает интерфейс, предоставляемый механизмом хранения соответствующей таблицы, для запроса.
Шаги вызова:

  1. Прочитайте первую строку таблицы, сделайте условное суждение и сохраните результат в наборе результатов, если он совпадает, в противном случае пропустите его;
  2. Вызовите интерфейс механизма для чтения «следующей строки» и повторите то же самое логическое суждение, пока не будет выбрана последняя строка таблицы;
  3. Исполнитель сформирует результирующий набор всех строк, удовлетворяющих условиям в вышеуказанном процессе переменных, и вернет его клиенту.

Логика, выполняемая для индексированной таблицы, аналогична: первый вызов — это интерфейс «первая строка, удовлетворяющая условию», а затем циклически вызывается интерфейс «следующая строка, удовлетворяющая условию».

Каждый раз, когда исполнитель вызывает интерфейс движка, поле rows_examined будет увеличиваться на 1, но значение rows_examined не равно количеству вызовов, потому что иногда интерфейс, вызывающий движок, будет сканировать несколько строк, а rows_examined на самом деле является числом отсканированных строк.

механизм хранения

Мы знаем, что данные действительно хранятся в движке, и можем указать, какой движок использовать при создании таблицы. Все эти механизмы являются подключаемыми, и их конкретные детали различаются, например, MyISAM, InnoDB, MEMORY и т. д. Эти часто используемые двигатели будут подробно описаны позже. Ниже приводится краткое введение в характеристики каждого двигателя.

  • MyISAM
    Он не поддерживает ни транзакции, ни внешние ключи, особенно приложения с высокой скоростью доступа, отсутствие требований к целостности транзакций или приложения на основе SELECT и INSERT, которые могут в основном использовать этот движок для создания таблиц.
  • InnoDB
    Поддерживает транзакции и внешние ключи.Вообще говоря, если требуется поддержка транзакций и существует высокая частота одновременного чтения, InnoDB является хорошим выбором, а MySQL 5.5 и более поздние версии являются механизмом InnoDB по умолчанию.
  • MEMORY
    Все данные хранятся в памяти, что подходит для небольшого объема данных и высокой скорости отклика.

Выше приведен простой анализ процесса запроса выбора. Пожалуйста, поправьте меня, если я ошибаюсь, добро пожаловать, чтобы оставить сообщение.
Продолжение следует! ! ! ! ! ! !