Запрос потока выполнения SQL

интервью MySQL

предисловие

Недавно мой друг Сяо Ван искал работу, и интервьюер спросил его, знает ли он"Запросите конкретный процесс выполнения sql".

Сяо Ван сказал, что не знает, а затем интервьюер сказал прямо Сяо Вану: «Молодой человек.Сок из крысиного хвоста (полезно), почему ты даже не знаешь, что это так просто?

Сяо Ван выпалил, услышав это: Хм! интервьюер выникаких боевых искусств, не играйте в карты по распорядку, вы должны спросить о знаниях, связанных с указателем, я это прекрасно знаю.

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

Уведомление: Эта статья в основном посвященаMySqlНапример, когда дело доходит до MySql, а затем ворчат о сестринской базе данных MySql, которая сейчас очень распространена.MariaDB.

Что такое МарияДБ?

После того, как MySql была приобретена Oracle, основатель MySql беспокоился о будущем развития базы данных MySql (медленная разработка, закрытый и, возможно, закрытый исходный код), поэтому он создал ветку MariaDB, которая по умолчанию использует новый механизм хранения Maria, который является оригинальной базой данных Mysql.MyISAMОбновленная версия механизма хранения.

Основная линия этой статьи:

①, общее описание архитектуры MySql;

②, серверный слой каждого узла Описание;

③, описание механизма хранения InnoDB;

Описание схемы MySql

Не будем ничего говорить, приклеим большую картинку, вырванную из интернета:

Картинка выше понятна? Непонятно, так что не волнуйтесь, давайте выложим еще один:

Описание уровня службы сервера:

Как видно из приведенной выше схемы архитектуры, серверный уровень в основном состоит изКоннектор, кэш запросов, парсер/анализатор, оптимизатор, исполнительОн состоит из нескольких частей, основные из которых будут описаны ниже.

Соединитель

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

Способ подключения:

MySQL поддерживает как короткие, так и длинные соединения. Короткое соединение должно быть закрыто сразу после завершения операции.

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

Меры предосторожности при использовании длинного соединения:

Клиент устанавливает длительное соединение с сервером.Действительное время по умолчанию8 часов, сервер MySql разорвет соединение через 8 часов, и если клиент снова запросит, он сообщитпроблема с отключением;

И сохранение длительного соединения потребляет память. После длительного периода бездействия сервер MySQL будет отключен. Как проверить 8-часовую тайм-аут?

-- 非交互式超时时间,如 JDBC 程序
show global variables like 'wait_timeout';  

-- 交互式超时时间,如数据库工具
show global variables like' interactive_timeout'; 

Результаты, полученные после выполнения фиг. По умолчанию - 28800 секунд, в течение 8 часов.

Все соединения в пуле соединений, используемые в общих проектах, являются длинными соединениями (например: druid, c3p0, dbcp и т. д.).

Например, чтобы проиллюстрировать реальные проблемы, вызванные длительным временем ожидания соединения и отключением:

У знакомого в компании есть система управления, в которой используется Mysql, но недавно он столкнулся с проблемой: позавчера система проста в использовании, а открыть ее после прихода в компанию на следующий день не получается, система перезагружается просто хорошо, но я какое-то время не знаю причину, что, черт возьми, беспокоит?

Наконец, просмотрев лог, я обнаружил, что соединения в пуле соединений все разъединены, потому что интервал между позавчерашним и следующим днем ​​на работе составил более 8 часов. Увы, такой маленький пункт знаний вызвал несколько дней путаницы, так быть не должно, или знания не исчерпывающие.

Что ж, теперь причина проблемы найдена, но как ее решить?

Решение для отключения при длительном тайм-ауте соединения:

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

2. Если вы используете MySQL 5.7 или более позднюю версию, вы можете повторно инициализировать ресурсы подключения, выполнив mysql_reset_connection после каждой большой операции. Этот процесс не требует повторного подключения и повторной аутентификации, но восстанавливает соединение до состояния, в котором оно было только что создано.

кэш запросов

Кэш MySQL по умолчанию отключен, а значит не рекомендуется использовать кеш, почему?

Почему MySql не включает кэширование по умолчанию?

В основном из-за его ограниченных сценариев использования:

1, сначала поговорим о формате хранения данных в кеше: ключ (оператор SQL) -значение (значение данных), поэтому, если есть разница в точке, он будет проверять ее напрямую;

②, поскольку данные в таблице не являются статическими, большинство из них постоянно меняются, и когда данные изменяются в базе данных, соответствующие данные кэша, связанные с этой таблицей, необходимо удалить;

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

Анализатор

Работа анализатора в основном состоит в том, чтобы разобрать оператор SQL, который должен быть выполнен, и, наконец, получить книгу абстрактной грамматики, а затем использовать препроцессор, чтобы определить, существует ли таблица в абстрактном синтаксическом дереве, и если да, то определить, существует ли выбранная таблица. поле столбца проекции находится в Exist в таблице и т. д.

лексический анализ

Лексический анализ используется для разбиения SQL на неделимые атомарные символы, называемые токенами. И в соответствии со словарем, предоставленным различными диалектами базы данных, он классифицируется на ключевые слова, выражения, литералы и операторы.

Разбор

Синтаксический анализ заключается в преобразовании оператора SQL в абстрактное синтаксическое дерево в соответствии с токеном (атомарным символом), разобранным с помощью лексического анализа. Ниже приведен прямой пример, показывающий, как выглядит абстрактная книга по грамматике SQL:

Оператор SQL:

SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18

Тогда абстрактная книга по грамматике, полученная с помощью приведенного выше оператора SQL после лексического анализа и грамматического анализа, выглядит следующим образом:

Изображение взято из:Убийство верхней сферы.Apache.org/document/…

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

препроцессор

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

Оптимизатор

Роль оптимизатора: В основном, синтаксическое дерево, полученное SQL после лексического анализа/анализа грамматики, с помощью содержимого словаря данных MySQL и статистической информации,серия операций, в результатеПлан реализации.

Какова последовательность операций, выполняемых в процессе оптимизации? Вот краткое описание:

1. Логическое преобразование: например, если в условии SQL 8>9, то логическое преобразование заключается в прямом упрощении постоянного выражения, существующего в синтаксическом дереве, и упрощении его до ложного; в дополнение к упрощению, есть также вычисление константного выражения Подождите.

2. Оптимизация затрат: оплатив стоимость некоторых статистических анализа данных, чтобы получить, может ли выполнение SQL пройти через индекс, и какие индексы дляходятся; Кроме того, в запросе ассоциации нескольких таблиц определяют порядок Окончательный стол присоединиться и т. д.;

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

Как просмотреть план выполнения MySql?

Просто добавьте ключевое слово объяснения перед выполняемым оператором SQL;

Расширение: как Oracle просматривает план выполнения? обратитесь к этой статьеOracle проверяет, использует ли оператор запроса индекс через план выполнения

Актуатор

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

Как видно из схемы архитектуры в начале статьи, механизм хранения подключен к исполнителю, а исполнитель вызывает данные и оперирует ими, вызывая API-интерфейс, предоставляемый механизмом хранения.

Описание механизма хранения

Механизм хранения — это компонент, который выполняет фактические операции с базовыми физическими данными и предоставляет различные API-интерфейсы для обработки данных для уровня сервера. MySQL поддерживает подключаемые механизмы хранения, включая InnoDB, MyISAM, Memory и т. д. Как правило, механизм хранения по умолчанию, используемый MySQL:InnoDB.

Механизм хранения InnoDB содержит обзор поддержки

расширять

Углубленное изучение механизма хранения InnoDB, нечего сказать, сначала вставьте его общую схему архитектуры: Как показано на рисунке ниже, механизм хранения InnoDB разделен на архитектуру памяти (структуры памяти) и дисковую архитектуру (структуры дисков).

Если вы хотите узнать больше, пожалуйста, обратитесь к этой статьеВы не знаете, что движок хранения Mysql InnoDB делится на архитектуру памяти и дисковую архитектуру?

❤ Подписаться + Нравится + Избранное + Комментарий

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

Вы можете поискать в публичном аккаунте [Muzilei] на VX и настаивать на качественных оригинальных технических статьях по Java, достойных вашего внимания!

использованная литература

①,Процесс выполнения запроса анализа архитектуры sql и MySQL

②,Что происходит с нижележащим уровнем при выполнении оператора SQL-запроса?