Как оператор SQL выполняется в MySQL

Java MySQL

предисловие

Недавно я начал изучать знания, связанные с MySQL. В соответствии с полученными знаниями я организовал и поделился ими в соответствии со своим собственным пониманием. В этой статье будет проанализирован процесс выполнения следующего оператора sql в mysql, в том числе то, как SQL-запрос будет проходить внутри mysql. , Как обновить оператор sql. Перед анализом я познакомлю вас с инфраструктурой MySQL. Знание того, из каких компонентов состоит MySQL и каковы функции этих компонентов, может помочь нам понять и решить эти проблемы.

1. Анализ архитектуры MySQL

Ниже приведена краткая диаграмма архитектуры mysql:

MySQL в основном делится на уровень сервера и уровень механизма хранения.

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

механизм хранения: он в основном отвечает за хранение и чтение данных. Он использует заменяемую архитектуру подключаемых модулей и поддерживает несколько механизмов хранения, таких как InnoDB, MyISAM и Memory. Механизм InnoDB имеет собственный модуль журнала redolog.

В качестве механизма по умолчанию используется InnoDB версии 5.5.5.

Соединитель

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

кэш запросов

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

Запрос Mysql не рекомендуется использовать кеш, потому что для часто обновляемых данных эффективное время кеша слишком короткое, и эффект часто нехороший.Для данных, которые не часто обновляются, все же можно использовать кеш, Mysql 8.0 После версии функция кеша была удалена, и официалы также считали, что эта функция редко использовалась в реальных сценариях приложений, поэтому ее просто удалили.

Анализатор

Если mysql не попадет в кеш, он попадет в анализатор.Анализатор в основном используется для анализа того, для чего предназначен оператор SQL.Анализатор также будет разделен на несколько шагов:

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

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

После выполнения этих двух шагов mysql готов к запуску, но как его выполнить и как его выполнить лучше всего? Тут на помощь приходит оптимизатор.

оптимизатор

Роль оптимизатора состоит в том, чтобы выполнить то, что он считает оптимальным планом выполнения (хотя иногда это не оптимально), например, как выбрать индекс, когда имеется несколько индексов, и как выбрать порядок ассоциации при запросе нескольких таблиц.

Актуатор

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

2. Анализ предложения

2.1 Оператор запроса

Сказав так много, как выполняется оператор sql? По сути наш sql можно разделить на два типа, один query, другой update (добавить, обновить, удалить). Давайте сначала проанализируем оператор запроса, оператор выглядит следующим образом:

select * from tb_student  A where A.age='18' and A.name='张三';

В сочетании с приведенным выше описанием мы анализируем поток выполнения этого оператора:

  • Сначала проверьте, есть ли у оператора разрешение. Если разрешения нет, сообщение об ошибке будет возвращено напрямую. Если есть разрешение, до версии mysql8.0 сначала будет запрошен кеш, а оператор sql будет использоваться как ключ, чтобы запросить память, чтобы увидеть, есть ли результат.Кэшировать напрямую, если нет, перейдите к следующему шагу.

  • Выполните лексический анализ с помощью анализатора, чтобы извлечь ключевые элементы оператора sql. Например, извлечение приведенного выше оператора — это запрос select, извлечение имени запрашиваемой таблицы — tb_student, и все столбцы должны быть запрошены. условием является id='1' этой таблицы. Затем оцените, есть ли в операторе sql грамматические ошибки, например, правильность ключевых слов и т. д. Если проверка прошла успешно, перейдите к следующему шагу.

  • Следующим шагом для оптимизатора является определение плана выполнения.Приведенный выше оператор SQL может иметь два плана выполнения:

      a.先查询学生表中姓名为“张三”的学生,然后判断是否年龄是18。
      b.先找出学生中年龄18岁的学生,然后再查询姓名为“张三”的学生。
    

    Затем оптимизатор выбирает наиболее эффективное решение в соответствии со своим алгоритмом оптимизации (оптимизатор считает, что иногда оно не обязательно является лучшим). После подтверждения плана выполнения он готов начать выполнение.

  • Выполнить проверку разрешения. Если разрешения нет, будет возвращено сообщение об ошибке. Если разрешение есть, будет вызван интерфейс ядра базы данных и будет возвращен результат выполнения ядра.

2.2 Заявление об обновлении

Выше приведен поток выполнения запроса sql, тогда давайте посмотрим, как выполняется оператор обновления? Оператор sql выглядит следующим образом:

update tb_student A set A.age='19' where A.name='张三';

Давайте изменим возраст Чжан Саня. Поле возраста определенно не будет установлено в реальной базе данных, иначе он будет побежден ответственным техническим лицом. На самом деле оператор будет в основном следовать процессу предыдущего запроса, но журнал должен быть записан при выполнении обновления, которое представит модуль журнала, тип модуля журнала binlog (архивный журнал), который поставляется с mysql, все можно использовать механизмы хранения.Наш широко используемый механизм InnoDB также поставляется с журналом журнала повторения модуля.Мы обсудим процесс выполнения этого оператора в режиме InnoDB. Процесс выглядит следующим образом:

  • Сначала запрашиваются данные Чжан Саня, если есть кеш, он тоже будет использоваться.
  • Затем получите оператор запроса, измените возраст на 19, а затем вызовите интерфейс API механизма, чтобы записать эту строку данных. Механизм InnoDB сохраняет данные в памяти и записывает журнал повторов. В это время журнал повторов входит в режим подготовки состояние, а затем сообщает исполнению, что выполнение завершено и может быть отправлено в любое время.
  • После того, как исполнитель получает уведомление, он записывает бинлог, затем вызывает интерфейс механизма и отправляет журнал повторов в состояние отправки.
  • обновление завершено.

Здесь должны быть некоторые студенты, которые спросят, зачем использовать два модуля журнала вместо одного модуля журнала? Это предыдущий режим mysql, движок MyISAM не имеет журнала повторов, поэтому мы знаем, что он не поддерживает транзакции, поэтому это не означает, что нельзя использовать только один модуль журнала, но движок InnoDB поддерживает транзакции через журнал повторов. . Тогда, спросят некоторые студенты, я использую два модуля журнала, но не такие уж сложные Почему журнал повторов вводит состояние подготовки перед фиксацией? Здесь мы используем противоречивый метод, чтобы объяснить, почему мы это делаем?

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

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

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

Это решает проблему непротиворечивости данных.

3. Резюме

  • Mysql в основном делится на серверный уровень и уровень механизма, который в основном включает в себя соединители, кэши запросов, анализаторы, оптимизаторы, исполнители и модуль журнала (binlog), который может совместно использоваться всеми механизмами выполнения.
  • Слой движка является подключаемым, в настоящее время в основном включает MyISAM, InnoDB, Memory и т. д.
  • Процесс выполнения оператора запроса выглядит следующим образом: проверка разрешений (при попадании в кеш) --- "кэш запросов ---" анализатор --- " оптимизатор --- " проверка разрешений --- " исполнитель --- "двигатель
  • Поток выполнения оператора обновления выглядит следующим образом: анализатор ---- "проверка полномочий" ---- "исполнитель" --- "механизм" --- журнал повторов (подготовить статус --- "бинлог ---" журнал повторов ( статус фиксации)

4. Ссылка