Примечания к исследованию:
Диаграмма базовой архитектуры MySQL
На самом деле выполнение оператора SQL-запроса не очень сложно!
Начнем с простейшего оператора запроса для анализа этой проблемы.
напримерSELECT * FROM T WHERE ID=10;
Каков весь процесс выполнения такого оператора?
На приведенном выше рисунке показана структурная схема MySQL, Из структуры видно, что структура MySQL в основном разделена на два уровня:
- уровень сервера В основном включают: коннектор, кеш запросов, анализатор, оптимизатор, исполнитель и т. д.
- слой двигателя Слой движка в основном отвечает за хранение и чтение данных.
Соединитель
Соединитель в основном отвечает за подключение к клиенту MySQL, получение разрешений и поддержание состояния подключения. Прежде чем мы захотим выполнить оператор MySQL, мы должны подключиться к клиенту MySQL и выполнить оператор:
mysql -h $hostname -P $port -u $user -p
При выполнении приведенного выше оператора возникнут следующие две ситуации:
- Произойдет ошибка, если имя пользователя или пароль неверны
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: NO)
, я полагаю, что большинство людей, которые использовали MySQL, сталкивались с этой ошибкой, и это также хорошо понимается буквально, доступ запрещен для пользовательского теста, а затем программа завершается. - Если имя пользователя и пароль верны, вы войдете в клиентский интерфейс MySQL. Перед входом MySQL запросит разрешения пользователя в соответствии с именем пользователя.Все проверки разрешений в этом соединении зависят от разрешений, запрошенных ранее.
кэш запросов
NOTE The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0
Кэш запроса относится к вводу оператора запроса. MySQL сначала выполнит кеш запроса, и если кеш будет срабатывать, результат запроса будет возвращен напрямую. В MySQL есть кеш для результата каждого запроса, Каждый раз, когда происходит изменение структуры таблицы базы данных или данных, кеш будет недействительным. Если кеш не попал, он продолжит выполнение. Поэтому в большинстве случаев частота попаданий в кеш очень низкая.Если это не статическая таблица с очень низкой частотой обновления, то частота попаданий в кеш будет очень низкой. Чиновники MySQL также отказались от поддержки кэширования запросов в MySQL 8.0. Поэтому в большинстве случаев не рекомендуется использовать кэш запросов. Для настройки кеша запросов обратитесь к официальной документации:Query Cache Configuration
Анализатор
Если кеш не попал, начинается реальный оператор выполнения. Работа анализатора в основном заключается в разборе входного оператора SQL. Во-первых, будет выполнен "лексический анализ". Когда вы вводите оператор SQL, система должна сначала распознать, что T - это имя таблицы, ID - это имя поля, WHERE и SELECT - это ключевое слово MySQL... и т.д. После этого будет выполнен "грамматический анализ". Анализ грамматики должен определить, допустимы ли эти ключевые слова. Если синтаксис введенного оператора SQL неверен, появится подсказка. Например, ключевое слово WHERE меньше, чем У.
SELECT * FROM T HERE ID = 10;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ID = 10' at line 1
Из приведенного выше вывода мы видим, что определение грамматики выполняется на этапе анализатора.Если вы столкнулись с синтаксической ошибкой, вам нужно только обратить внимание наuse near
Часть после ключевого слова.
оптимизатор
Как следует из названия, оптимизатор — это этап оптимизации операторов SQL.Если у некоторых студентов возникнут проблемы, оператор SQL уже написан, и система MySQL все еще может его оптимизировать? Ответ: конечно.
SELECT * FROM t1 JOIN t2 ON `id` WHERE t1.a = 10 AND t2.b = 20;
Выше приведен простой оператор SQL, порядок выполнения системы может быть следующим:
- Вы можете сначала запросить данные, у которых поле a в таблице t1 равно 10, а затем связать таблицу t2 по идентификатору в соответствии с результатом запроса, чтобы определить, равно ли поле b в таблице t2 20.
- Вы также можете запросить данные в таблице t2, где поле b равно 20, а затем связать их с таблицей t1 через идентификатор в соответствии с результатом вставки, чтобы определить, равно ли поле a в таблице t1 10.
Также есть некоторые оптимизации для индексов базы данных, эта часть более сложная и будет обсуждаться отдельно позже.
Актуатор
Когда первые несколько шагов выполнены, он начинает входить в стадию исполнителя.Исполнитель сначала выполнит проверку разрешений, чтобы определить, есть ли у текущего пользователя разрешение на операцию инструкции SQL.Если нет, будет сообщено об ошибке.
DELETE FROM t;
ERROR 1142 (42000): DELETE command denied to user 'test'@'localhost' for table 't'
Если проверка разрешения также пройдена, запрос будет выполнен, и запрос будет выполнен путем вызова API, предоставленного движком.
двигатель
Уровень механизма существует в виде подключаемых модулей, а механизм хранения отвечает за хранение и извлечение данных в MySQL. Сервер взаимодействует с механизмом хранения через API-интерфейсы, и эти API-интерфейсы маскируют различия между различными механизмами, поэтому различия между механизмами не влияют на уровень службы. Также нет связи между разными механизмами хранения данных и они не будут влиять друг на друга.