Уроки, извлеченные из колонки 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"
, только переподключиться.
Чтобы база данных не занимала много памяти, для ее решения можно использовать следующие методы:
- Периодически отключайте длинные соединения или соединения, занимающие слишком много памяти.
- Mysql5.7 и выше, каждое выполнение более крупной операции, исполняемый
"mysql_reset_connection"
Команда для инициализации ресурсов соединения, эта операция не будет переподключаться и повторно получать авторизацию, а просто восстанавливает состояние только что установленного соединения.
кэш запросов
После установления соединения можно выполнить операцию выбора, которая выполнит вторую часть: кеш запросов.
Когда приходит запрос, сначала запросите кеш, чтобы узнать, существует ли запись. Оператор, который был выполнен ранее, будет использовать оператор в качестве ключа, а результат, установленный после выполнения, будет сохранен в памяти как значение.
- Если он будет найден в кеше, он будет возвращен непосредственно клиенту.
- Если запись не найдена, продолжайте выполнять следующие операции и сохраните оператор и результат в памяти как ключ-значение.
Не рекомендуется использовать кэш запроса, эта операция больше вреда, чем хорошая (после MySQL8.0 удалит функцию)
Для таблицы, пока есть обновление, все кеши, связанные с таблицей, будут очищены.
Только для статических таблиц, которые не часто обновляются
рекомендовать:
- Задайте для query_cache_type значение DEMAND. По умолчанию SQL не использует кеш запросов. Для операторов, которым требуется кеш запросов, используйте SQL_cache, чтобы явно указать, например:
select SQL_CACHE * from T where ID = 10;
Анализатор
Что делает этот SQL
- лексический анализ
Определите ключевые слова SQL и придумайте основные компоненты. MySQL согласно"select"
Делается вывод, что это оператор-запрос, согласно"from T"
Идентификация таблицы T, будет"ID"
Распознаются как имена столбцов. - Разбор
По правилам грамматики определить, соответствует ли синтаксис SQL. При возникновении ошибки система выдает запрос:"You have an error in your SQL syntax..."
, сзади не то место, которое требует вашего внимания"use naer"
более позднее содержание.
оптимизатор
Как сделать этот SQL
На этом шаге будет выбран оптимальный метод выполнения, например:
- Когда задействовано несколько индексов, решите, какой индекс использовать.
- Когда несколько связанных таблиц определяют порядок подключения
Этот шаг решает, следует ли сначала извлечь значение идентификатора c=10 из таблицы t1 или сначала найти значение идентификатора d=20 в таблице t2.select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
Актуатор
реальные шаги выполнения
По разрешению, полученному коннектором, судят, есть ли разрешение у таблицы T.
- Если у вас есть разрешение, откройте таблицу, чтобы продолжить.
После открытия таблицы используйте интерфейс, предоставляемый движком, в соответствии с определением движка таблицы. пример:
-
Таблица T поле ID Нет индекса:
- Вызовите интерфейс, предоставленный InnoDB, выньте первую строку и поместите данные строки в набор результатов, когда ID=10. Если они не совпадают, вызывайте интерфейс механизма каждый раз, чтобы получить следующую строку, и снова оценивайте до последней строки данных.
- Сохраните набор результатов в кеше и верните его клиенту.
-
Поле ID в таблице T имеет индекс:
- вызов InnoDB
"获取满足条件的第一行"
Интерфейс, серверный уровень снова оценит правильность значения, а затем поместит его в набор результатов, а затем продолжит доступ"满足条件的下一行"
Интерфейсы, которые уже определены движком.
- вызов InnoDB
В MySQLжурнал медленных запросов, поле rows_examined указывает, сколько строк сканируется во время выполнения инструкции.Это значение добавляется, когда движок вызывается для получения строк данных.
В некоторых сценариях исполнитель вызывается один раз, а внутри движка сканируется много строк, поэтомуКоличество строк, просканированных движком, не совсем совпадает с rows_examined., что будет подробно объяснено позже.
Знания в области комментариев:
-
Вопрос: Если полей в запросе нет, то ошибка на каком этапе?
- Ответ: На этапе анализатора будет сообщено об ошибке.
- «Высокопроизводительный MySQL» упоминает синтаксический анализатор и препроцессор. Синтаксический анализатор: обработайте грамматику и проанализируйте запрос и сгенерируйте соответствующее дерево синтаксического анализа. Препроцессор: дополнительно проверьте правильность дерева синтаксического анализа, например: существуют ли таблица данных и столбец данных, неоднозначен ли псевдоним и т. д. Если он проходит, новое дерево синтаксического анализа генерируется и передается оптимизатору.
-
Connect_timeout относится к времени ожидания «в процессе подключения».
-
wait_timeout относится к времени ожидания «после завершения соединения во время использования».
Эта статья содержит изображения и часть исходного текста «Практики MySQL» Geek Time. Если есть какие-либо нарушения, пожалуйста, свяжитесь со мной, чтобы немедленно удалить их.
Раздел II:Одна из серий MySQL обновляет жизненный цикл SQL.