Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик-аккаунт, просьба указывать источник перепечатываемой статьи.
Это первая статья из серии [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
демон.
$ 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
Общая операция, давайте подумаем о том, как решать проблемы с глобальными, а не ограничиваться определенным аспектом.
Добро пожаловать, чтобы отсканировать код, чтобы следовать, учиться и прогрессировать вместе