Каков опыт выполнения инструкции sql?

MySQL

Я имею дело с mysql каждый день.Знаете, какой процесс он прошел, чтобы выполнить простой оператор select?

Прежде всего, mysql в основном состоит из уровня сервера и уровня хранения. Уровень сервера в основном включает коннекторы, кэши запросов, анализаторы, оптимизаторы и исполнители. Уровень хранилища в основном используется для хранения и запроса данных.Обычные механизмы хранения включают InnoDB и MyISAM.После MySQL 5.5.5 InnoDB используется в качестве механизма хранения по умолчанию.

Соединитель

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

кэш запросов

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

Если кеша нет, продолжите выполнение позже и сохраните результат выполнения и инструкцию в кеше.

Обратите внимание, что после mysql8 нет функции кеша запросов, потому что этот кеш очень легко очистить, а процент попаданий относительно низок. Пока в таблице есть обновление, весь кэш в таблице будет очищен, поэтому содержимое, которое вы только что кэшировали, будет очищено другим обновлением, прежде чем его можно будет использовать.

Анализатор

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

Если анализатор обнаруживает ошибку, он возвращает сообщение об ошибке типа «У вас есть ошибка в вашем sql» и завершает запрос.

оптимизатор

После прохождения анализатора mysql понимает, что вы хотите сделать. Обычно для одного и того же оператора sql в mysql может быть несколько схем выполнения, например, какой индекс выбрать при наличии нескольких индексов и как подтвердить порядок подключения каждой таблицы, когда с запросом связано несколько таблиц.

Результаты выполнения этих схем одинаковы, но эффективность выполнения разная, поэтому mysql перед выполнением нужно попытаться найти оптимальную схему, что является основной работой оптимизатора. Однако mysql также выберет неверный план, поэтому я не буду здесь вдаваться в подробности, а причину объясню позже.

Актуатор

После того, как оптимизатор выбирает план, исполнитель выполняет оператор SQL в соответствии с выбранным планом. Как мы упоминали ранее, разрешения текущего пользователя считываются в коннекторе, коннектор только получает разрешения, а не оценивает и не проверяет разрешения.

Следовательно, в исполнителе разрешение будет оцениваться перед выполнением инструкции.Если соответствующего разрешения нет, он вернется напрямую и подскажет, что соответствующего разрешения нет.

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

Обратите внимание, что если кеш найден в кеше предыдущего запроса, перед возвратом результата также будет выполнена проверка разрешений.

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

На этом выполнение оператора запроса sql заканчивается. Это грубо, это всего лишь грубый процесс, и каждый шаг очень сложен в базовой реализации mysql, и я расскажу о базовом принципе реализации индекса позже.