Повторное изучение MySQL (1): рассказ об архитектуре MySQL

MySQL

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

Это первая статья из серии [Relearn MySQL series], которую я написал.

Причина написания этой серии статей заключается в том, что в качествеWeb后端程序员, что требует частогоMySQLРаботая друг с другом, но большую часть времени он по-прежнему остается в добавлении, удалении, изменении и проверке (CURD) на уровне приложения, но по мере того, как объем данных, отвечающих за проект, растет, а производительность серверного оборудования начинает снижаться, я чувствую потребность в более всестороннем и глубоком изучении и понимании.MySQL, для лучшей производительностиMySQLпроизводительность и улучшенное использованиеMySQLСпособность.

Общая архитектура MySQL

Как и все серверное ПО,MySQLтакже используетсяC/S架构, то есть клиент (Client) и сервер (Server) архитектура, которую мы используемMySQLКогда это клиент, он отправляет запрос на подключение к работающему серверу.MySQLдемон, покаMySQLСерверная сторона обрабатывает в соответствии с нашим запросом и возвращает нам обработанный результат.Этот процесс можно просто абстрагироваться в следующую схематическую диаграмму:

Клиент (Клиент)

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

существуетshellвходитьmysqlкоманда для запуска соединенияMySQLСервер выглядит следующим образом:

$ mysql -u root -p
Enter password:*******

После ввода пароля вы попадете вMySQLКлиентский интерфейс:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25338 to server version: 5.7.29-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

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

Введите \q, exit, quit, чтобы выйти из клиента, например:

mysql>exit
Bye

КромеMySQLСобственный клиент командной строки, на самом деле, есть несколько более часто используемыхGUIКлиент, такой как тот, который мы используемNavicatплюс доступ к различным языкам программированияMySQLБиблиотека классов на самом деле связана сMySQLклиент.

Сервер (Сервер)

Схема выше может быть слишком абстрактной и упрощенной, углубитесь вMySQLВнутри сервера мы можем использовать следующую схему для описания всегоMySQLЛогическая архитектура:

Логическая схема архитектуры MySQL (нарисована мной)

что мы говоримMySQLНа самом деле чащеMySQLсервер,MySQLСервер — это процесс-демон, отвечающий за ответы на запросы клиентов.

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

$ bin/mysqld

Как видно из диаграммы выше,MySQLСторону сервера можно условно разделить на уровень сервера и уровень механизма хранения, а уровень сервера — это управление соединениями, синтаксический анализ и оптимизация, оптимизатор запросов и исполнитель соответственно, а взаимодействие между уровнем сервера и механизмом хранения осуществляется через единый вызов API, давайте узнаем больше о функциях и ролях каждого компонента MySQL Server.

диспетчер соединений

连接管理器Роль состоит в том, чтобы управлять и поддерживать все соединения запроса клиента MySQL, когда мы отправляемMySQLДелая запрос,连接管理器Будет отвечать за создание подключения и проверку разрешений пользователя.

Для установленного соединения, если запрос не отправляется слишком долго, менеджер соединений автоматически отключит соединение, мы можем установить переменнуюwait_timeoutРешите, как часто отключать неактивные соединения.

кэш запросов

Когда мы установим соединение с коннектором, если мы выполнимSELECTзаявление, коннектор начнется с查询缓存Запросите, выполнялся ли этот оператор ранее. Если нет, идите дальше, и если да, оцените соответствующее разрешение и верните результат напрямую, если он соответствует разрешению.

查询缓存На самом деле оператор запроса рассматривается какkey, результат запроса используется, когдаvalue, учредилkey-valueструктура кэша.

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

mysql> select SQL_CACHE * from users where uid = 1000;

возможныйMySQLОфициальная команда также поняла, что кеш запросов мало влияет.MySQL 8.0В версии удалена вся функция кеша запросов, поэтому если вы используетеMySQL 8.0версии функция кэширования запросов не существует.

парсер

Когда в кэше запросов нет командного запроса, вам нужно фактически выполнить оператор, а затем передать его в解析器Сначала выполните лексический анализ, разберите введенное нами предложение, а затем выполните грамматический анализ, чтобы определить, соответствует ли введенное нами предложениеMySQLправила синтаксиса, если оператор ввода не соответствует правилам синтаксиса MySQL, он остановит выполнение и выдаст сообщение об ошибке.

Например, мы вводим следующий оператор ошибки:

select * users

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

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 'users' at line 1

оптимизатор запросов

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

В процессе оптимизации оптимизаторSQLУсловие запроса оператора определяет, какой индекс использовать, если есть соединение (join), который определит порядок запросов к таблице и, наконец, сгенерирует план выполнения на основе оптимизированного результата, который будет выполняться следующими исполнителями.

Актуатор

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

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

механизм хранения

存储引擎,также называемый表类型, его конкретная роль заключается в том, чтобы решить, как таблица данных обрабатывает и хранит данные в таблице,MySQLПоддерживает множество различных механизмов хранения, и механизм хранения разработан с возможностью подключения.В одной и той же базе данных разные таблицы данных могут использовать разные механизмы хранения.

InnodbдаMySQLПодсистема хранения по умолчанию также является широко используемой подсистемой хранения.MyISAMиMomery.

Механизмы хранения, поддерживаемые запросами

После подключения к серверу MySQL мы можем использовать следующую команду для запроса текущегоMySQLПоддерживаемые сервером механизмы хранения:

mysql > show engines

Результат выполнения приведенного выше оператора показан в следующей таблице:

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

Из таблицы выше видно, что мой локальныйMySQLПоддерживаются механизмы хранения 9. В приведенной выше таблицеEngineВ столбце указано имя механизма хранения,Supportстолбец, указывающий, доступен ли двигатель,DEFAULTЭто означает, что двигатель является двигателем по умолчанию,Commentэто описание двигателя,TransactionsСтолбец используется, чтобы указать, поддерживает ли механизм хранения транзакции,XAВ столбце указано, поддерживает ли механизм хранения распределенные транзакции,SavepointsВ столбце указано, поддерживает ли механизм хранения частичный откат транзакций.

Укажите механизм хранения

InnodbдаMySQLМеханизм хранения по умолчанию, что означает, что если вы не укажете механизм хранения при создании таблицы данных, по умолчанию будет использоватьсяInnodb, а следующий оператор демонстрирует повторное указание механизма хранения при создании таблицы данных следующим образом.usersтехническое описание, мы использовалиMyISAMнакопительный двигатель.

mysql> CREATE TABLE users(
    -> uid int not null,
    -> username varchar(32) not null,
    -> email varchar(64) not null,
    -> gender tinyint not null,
    -> primary key(uid)
    -> )engine=MyISAM
    -> ;
Изменить механизм хранения таблицы

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

ALTER TALBE 数据表名称 ENGINE=存储引擎的名称

Например, мы положилиusersМеханизм хранения таблицы начинается сMyISAMизменить наInnoDB

ALTER TABLE users ENGINE=InnoDB;

резюме

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

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