Процесс выполнения оператора запроса SQL в серии MySQL

задняя часть MySQL сервер SQL

Уроки, извлеченные из колонки Geek Time «Практика MySQL»

Недавно я приобрел курс «MySQL Практические 45 лекций» от Geek Time.

В этом разделе в основном рассказывается об инфраструктуре MySQL. Например, при выполнении следующего оператора:

mysql> select * from T where ID=10;

Как этот оператор обрабатывается внутри MySQL.

Схема инфраструктуры


Основная часть разделена на две части: серверную часть и часть механизма хранения.

Сервер включает в себя: коннекторы, кэш-запросы, анализаторы, оптимизаторы и исполнители. Такие функции, как хранимые процедуры, триггеры и представления, обрабатываются на уровне сервера.

Механизм хранения отвечает за хранение и извлечение данных. Распространенными являются InnoDB и MyISAM.

Соединитель

Коннекторы устанавливают соединения с клиентами, получают разрешения, поддерживают соединения и управляют ими.

Общие команды:

mysql -uroot -ppassword

Он используется для установления соединения с сервером, а процесс аутентификации завершается после рукопожатия TCP.

  • Пароль учетной записи неверен, и сообщается об ошибке: «Доступ запрещен для пользователя».
  • После прохождения аутентификации запросите имеющиеся разрешения в таблице разрешений.

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

После установления соединения, если оно долгое время не используется,"show processlist"Команда может видеть соединение в спящем состоянии.
При отсутствии активности в течение указанного времени соединение будет автоматически разорвано.установить времяЗависит отwait_timeoutконтроль, по умолчанию 8 часов. После отключения отправьте его снова, и вам будет предложено"Lost connection to MySQL server during query", только переподключиться.

Чтобы база данных не занимала много памяти, для ее решения можно использовать следующие методы:

  1. Периодически отключайте длинные соединения или соединения, занимающие слишком много памяти.
  2. Mysql5.7 и выше, каждое выполнение более крупной операции, исполняемый"mysql_reset_connection"Команда для инициализации ресурсов соединения, эта операция не будет переподключаться и повторно получать авторизацию, а просто восстанавливает состояние только что установленного соединения.

кэш запросов

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

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

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

Не рекомендуется использовать кэш запроса, эта операция больше вреда, чем хорошая (после MySQL8.0 удалит функцию)

Для таблицы, пока есть обновление, все кеши, связанные с таблицей, будут очищены.
Только для статических таблиц, которые не часто обновляются
рекомендовать:
- Задайте для query_cache_type значение DEMAND. По умолчанию SQL не использует кеш запросов. Для операторов, которым требуется кеш запросов, используйте SQL_cache, чтобы явно указать, например:

select SQL_CACHE * from T where ID = 10;

Анализатор

Что делает этот SQL

  1. лексический анализ
    Определите ключевые слова SQL и придумайте основные компоненты. MySQL согласно"select"Делается вывод, что это оператор-запрос, согласно"from T"Идентификация таблицы T, будет"ID"Распознаются как имена столбцов.
  2. Разбор
    По правилам грамматики определить, соответствует ли синтаксис SQL. При возникновении ошибки система выдает запрос:"You have an error in your SQL syntax...", сзади не то место, которое требует вашего внимания"use naer"более позднее содержание.

оптимизатор

Как сделать этот SQL

На этом шаге будет выбран оптимальный метод выполнения, например:

  1. Когда задействовано несколько индексов, решите, какой индекс использовать.
  2. Когда несколько связанных таблиц определяют порядок подключения
    select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
    
    Этот шаг решает, следует ли сначала извлечь значение идентификатора c=10 из таблицы t1 или сначала найти значение идентификатора d=20 в таблице t2.

Актуатор

реальные шаги выполнения

По разрешению, полученному коннектором, судят, есть ли разрешение у таблицы T.

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

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

  • Таблица T поле ID Нет индекса:

    • Вызовите интерфейс, предоставленный InnoDB, выньте первую строку и поместите данные строки в набор результатов, когда ID=10. Если они не совпадают, вызывайте интерфейс механизма каждый раз, чтобы получить следующую строку, и снова оценивайте до последней строки данных.
    • Сохраните набор результатов в кеше и верните его клиенту.
  • Поле ID в таблице T имеет индекс:

    • вызов InnoDB"获取满足条件的第一行"Интерфейс, серверный уровень снова оценит правильность значения, а затем поместит его в набор результатов, а затем продолжит доступ"满足条件的下一行"Интерфейсы, которые уже определены движком.

В MySQLжурнал медленных запросов, поле rows_examined указывает, сколько строк сканируется во время выполнения инструкции.Это значение добавляется, когда движок вызывается для получения строк данных.

В некоторых сценариях исполнитель вызывается один раз, а внутри движка сканируется много строк, поэтомуКоличество строк, просканированных движком, не совсем совпадает с rows_examined., что будет подробно объяснено позже.


Знания в области комментариев:

  • Вопрос: Если полей в запросе нет, то ошибка на каком этапе?

    • Ответ: На этапе анализатора будет сообщено об ошибке.
    • «Высокопроизводительный MySQL» упоминает синтаксический анализатор и препроцессор. Синтаксический анализатор: обработайте грамматику и проанализируйте запрос и сгенерируйте соответствующее дерево синтаксического анализа. Препроцессор: дополнительно проверьте правильность дерева синтаксического анализа, например: существуют ли таблица данных и столбец данных, неоднозначен ли псевдоним и т. д. Если он проходит, новое дерево синтаксического анализа генерируется и передается оптимизатору.
  • Connect_timeout относится к времени ожидания «в процессе подключения».

  • wait_timeout относится к времени ожидания «после завершения соединения во время использования».

Эта статья содержит изображения и часть исходного текста «Практики MySQL» Geek Time. Если есть какие-либо нарушения, пожалуйста, свяжитесь со мной, чтобы немедленно удалить их.
Раздел II:Одна из серий MySQL обновляет жизненный цикл SQL.