Выполните SQL в Mysql, что произойдет?

MySQL

задний план

Мы все часто используем Mysql в качестве базы данных для хранения и запроса часто используемых данных. Когда мы вводим строку, напримерSELECT * FROM table_name WHERE id=26После такого оператора Mysql выведет нужную вам информацию, если он будет выполнен правильно.

Итак, после того, как вы введете эту строку оператора, пока она не отобразит нужную вам информацию, что случилось с Mysql в середине? В этой статье мы кратко обсудим этот вопрос.

Диаграмма базовой архитектуры MySQL

Давайте сначала посмотрим на более общую схему архитектуры Mysql.

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

клиент

Так называемый клиент — это терминал, который мы используем для входа в систему и работы с Mysql. Мы все работаем с Mysql на стороне клиента, будь то ввод информации для подключения к базе данных, ввод SQL для запроса таблицы или получение информации о запросе, возвращаемой нам Mysql, все это делается на стороне клиента.

Соединитель

Проверка информации о пользователе

Мы находимся перед клиентом и хотим использовать базу данных Mysql, поэтому первым шагом является подключение к базе данных, которую вы хотите использовать.

Мы все знаем, что собираемся ввести командуmysql -h$ip -P$port -u$username -p.

После этого клиент попросит нас ввести пароль. После этого, если нет проблем с введенной нами информацией, мы войдем в интерфейс работы Mysql.

Если есть проблема с введенной информацией, мы получим сообщение об ошибке, возвращенное клиентом. Например, если мы введем неправильный пароль, мы получим сообщение об ошибке типа «Доступ запрещен для пользователя».

Итак, что именно делает этот промежуточный разъем?

Во-первых, коннектор примет IP-адрес и порт, которые мы ввели, чтобы выполнить самое классическое рукопожатие TCP.Если рукопожатие не удалось, никаких последующих действий не будет, и соответствующее сообщение об ошибке будет возвращено напрямую.

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

Получение разрешения пользователя

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

Есть 4 таблицы разрешений:user, db, tables_priv, columns_priv.

Когда пользователь проходит проверку разрешения и назначается разрешение, оно назначается в следующем порядке: user, db, table_priv и columns_priv. То есть сначала проверяем глобальную таблицу разрешений пользователя user, если соответствующее разрешение в user равно Y, разрешение пользователя на все базы данных Y, а остальные 3 таблицы проверяться не будут, если N, то проверяем в бд table Конкретная база данных, соответствующая этому пользователю, и получите разрешение Y в БД; если БД N, проверьте конкретную таблицу, соответствующую этой базе данных в table_priv, и получите разрешение Y в таблице; если это N, проверьте конкретную таблицу в столбце columns_priv.

Это означает, что когда мы изменяем пользовательские разрешения пользователя, это не повлияет на пользователя до тех пор, пока пользователь не войдет в систему в следующий раз (создаст новое соединение).

подключиться и ждать тайм-аут

мы можем пройтиshow processlistдля просмотра всех текущих подключений пользователей и их поведения.

Поле в команде отображает текущий статус пользователя, в это время пользователь запрашивает статус.

Но если состояние, отображаемое Command, — Sleep, это означает, что пользователь в настоящее время находится в состоянии ожидания. Если вы подождете больше определенного периода времени, разъем автоматически отключится.

Время ожидания контролируется переменной wait_timeout, доступ к которой можно получить с помощьюshow global variables like 'wait_timeout'Проверять.

mysql по умолчанию составляет 28800 секунд, что составляет 8 часов.

Длинные и короткие соединения

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

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

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

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

регистр

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

Кэш использует форму хранения «ключ-значение», значение ключа хранит оператор запроса, а значение значения сохраняет соответствующий результат.

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

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

Обычно он отключен по умолчанию. И Mysql полностью откажется от этой функции, начиная с версии 8.0.

Анализатор

Предположим, что мы не используем кеш, или оператор SQL не попадает в кеш.

Затем, после того как коннектор выполнит операцию подключения, мы вводим оператор запроса, например:SELECT host FROM mysql.user LIMIT 1.

И что делает анализатор, так это делает«лексический анализ»и"Разбор".

так называемый«лексический анализ», заключается в оценке каждого введенного вами слова, например, анализатор сначала определит, что первое введенное вами слово — «ВЫБОР», второе введенное слово — «хост» и так далее.

и"Разбор"является следующее«лексический анализ»После этого он основан на введенных словах, чтобы определить, соответствует ли ваш ввод правилам грамматики.

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

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

оптимизатор

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

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

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

В другом примере выполните операторselect * from t1 join t2 on t1.ID=1 and t2.ID=2,

Когда этот оператор выполняется, он сначала находит строку с ID=1 из таблицы t1 и связывает ее с таблицей t2, а затем находит строку с ID=2 из таблицы t2.

Или сначала найдите строку с ID=2 из таблицы t2 и свяжите ее с таблицей t1, а затем найдите строку с ID=1 из таблицы t1.

Два порядка выполнения могут привести к разной эффективности выполнения.Выбор порядка выполнения повысит эффективность выполнения, что также должно делать оптимизатор.

Актуатор

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

Пример предложения:select * from mysql.tables_priv

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

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

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

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

Суммировать

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