Ярлыки: Ярлык: Статья публичного аккаунта «Мы все маленькие лягушки»
SQL
Полное имяStructured Query Language
, в переводе на китайский结构化查询语言
. Это утверждение грамматики, что является декларативным? Вы можете думать о боссе в нашей жизни, босс скажет вам, когда миссия будет устроена: Сяо Ван, сегодня переместил эти кирпичи из А в Б, а потом нет. Босса не волнует, используете ли вы свою руку или машину, босса волнует только результат: вы будете перемещать кирпичи. Наша база данных - босс,SQL
Оператор - это задача, которую мы назначаем базе данных. Что касается того, как выполняется конкретная база данных, нас не волнует. Нас интересует только результат, возвращаемый базой данных в конце.
Человек, разрабатывающий базу данных, должен тщательно продумать, как выполнить оператор. дизайнMySQL
Дядя искусственноMySQL
разделен наserver
слой и存储引擎
слой, но какие операции находятся вserver
слой делает, какая операция находится в存储引擎
Вы можете быть немного смущены слоями. В этой статье будет использован пример, чтобы показать, за что они оба несут ответственность.
Готов к работе
Для плавного развития сюжета сначала создадим таблицу:
CREATE TABLE hero (
id INT,
name VARCHAR(100),
country varchar(100),
PRIMARY KEY (id),
KEY idx_name (name)
) Engine=InnoDB CHARSET=utf8;
мыhero
Таблицаid
столбец создает кластеризованный индекс дляname
列创建了一个二级索引。 этоhero
Таблица в основном используется для хранения некоторых героев периода Троецарствия.Вносим в таблицу некоторые записи:
INSERT INTO hero VALUES
(1, 'l刘备', '蜀'),
(3, 'z诸葛亮', '蜀'),
(8, 'c曹操', '魏'),
(15, 'x荀彧', '魏'),
(20, 's孙权', '吴');
Теперь данные в таблице выглядят так:
mysql> SELECT * FROM hero;
+----+------------+---------+
| id | name | country |
+----+------------+---------+
| 1 | l刘备 | 蜀 |
| 3 | z诸葛亮 | 蜀 |
| 8 | c曹操 | 魏 |
| 15 | x荀彧 | 魏 |
| 20 | s孙权 | 吴 |
+----+------------+---------+
5 rows in set (0.00 sec)
Приготовления сделаны.
текст
Перед выполнением оператора необходимо сгенерировать так называемый план выполнения, то есть то, как будет выполняться оператор (какой индекс использовать, какой порядок подключения использовать и т. д.), мы можем передатьExplain
оператор для просмотра плана выполнения, например, для следующего оператора:
mysql> EXPLAIN SELECT * FROM hero WHERE name < 's孙权' AND country = '蜀';
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+------------------------------------+
| 1 | SIMPLE | hero | NULL | range | idx_name | idx_name | 303 | NULL | 2 | 20.00 | Using index condition; Using where |
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+------------------------------------+
1 row in set, 1 warning (0.03 sec)
выходной результатkey
значение столбцаidx_name
,type
Значение столбцаrange
, указывая на то, чтоidx_name
Вторичный индекс выполняет запрос диапазона. У многих студентов возникают сомнения: хотите ли вы одновременно получить все подходящие вторичные индексы, а затем выполнить операцию возврата таблицы единообразно, или выполнять операцию возврата таблицы каждый раз, когда из вторичного индекса извлекается квалифицированная запись? фактическиВзаимодействие между уровнем сервера и уровнем механизма хранения осуществляется в единицах записей., полный процесс выполнения приведенного выше оператора выглядит следующим образом:
-
Серверный уровень начинает выполнять запрос в первый раз, ставя условие
name < 's孙权'
Передайте его подсистеме хранения и позвольте подсистеме хранения найти первую запись, соответствующую условиям. -
Механизм хранения находится во вторичном индексе
idx_name
Среднее позиционированиеname < 's孙权'
Первая запись , очевидно, запись вторичного индекса, удовлетворяющая этому условию,name
Значение столбца'c曹操'
. Затем важно отметить, что мы видимEXPLAIN
вывод заявленияExtra
колонка имеетUsing index condition
, что свидетельствует о том, чтоidx_name
Условия запроса вторичного индекса оцениваются на уровне механизма хранения.Эта функция является так называемой索引条件下推
(Индексное условие Pushdown, называемоеICP
). Очевидно здесьICP
состояниеname < 's孙权'
.有的同学可能会问这不就是脱了裤子放屁么,name
значение'c曹操'
Эта запись черезname < 's孙权'
Это состояние позиционируется, зачем вам еще раз его судить? Это грубый дизайн дяди, разработавшего MySQL, он очень простой, нет причин~Советы: Ситуация с использованием вторичного индекса для эквивалентного запроса немного отличается. Например, приведенное выше условие заменено на `name = 'S Sun Quan'`. Для эквивалентного запроса дядя, который разработал MySQL, имеет уровень механизма хранения InnoDB. Схемы специального лечения не рассматриваются как состояния ДЦП.
Затем возьмите значение первичного ключа в записи вторичного индекса, чтобы вернуться к таблице, получить полную запись пользователя и вернуть ее в
server层
(То есть вы вернетесь к таблице после записи вторичного индекса, а не поместите все записи вторичного индекса, а затем вернете таблицу). -
Результат нашего плана выполнения
Extra
колонка имеетUsing Where
Приглашение означает, что после того, как уровень сервера получит запись, возвращенную уровнем механизма хранения, он затем оценит, установлены ли остальные условия WHERE (то есть, снова оценит.country = '蜀'
Установлено). Если это правда, он отправляется непосредственно клиенту.Советы: Какие? Найти запись, соответствующую условиям, и отправить ее клиенту? Тогда почему мой клиент не выводит результаты запроса по одному, а все сразу? Это призрак клиентского ПО, оговорено, что все записи будут отображаться до их получения.
Если не установлено, пропустите запись.
-
Затем уровень сервера просит уровень механизма хранения продолжить чтение следующей записи предыдущей записи.
-
Поскольку информация заголовка каждой записи имеет
next_record
Это свойство , так что вы можете быстро найти позицию следующей записи, а затем продолжить судитьICP
условие, механизм хранения возвращает следующую запись на серверный уровень после ее выборки. -
Затем повторяйте процесс шага 3, пока уровень механизма хранения не обнаружит несоответствие.
name < 's孙权'
Запись, а затем возврат прочитанной информации на серверный уровень, который является серверным уровнем, завершит запрос.
Этот процесс все еще немного многословен для описания на языке, давайте напишем суперупрощенную версию псевдокода, чтобы взглянуть (обратите внимание, это суперупрощенная версия):
first_read = true; //是否是第一次读取
while (true) {
if (first_read) {
first_read = false;
err = index_read(...); //调用存储引擎接口,定位到第一条符合条件的记录;
} else {
err = index_next(...); //调用存储引擎接口,读取下一条记录
}
if (err = 存储引擎的查询完毕信息) {
break; //结束查询
}
if (是否符合WHERE条件) {
send_data(); //将该记录发送给客户端;
} else {
//跳过本记录
}
}
После приведенного выше псевдокода, хотя и очень грубого, но также демонстрирующего основное значение Siha ~ у нас есть возможность повторно нажать кнопку, используя временную таблицу.filesort
как реализуется ситуация.
Не по теме
Написание статей очень утомительно, и иногда вы чувствуете, что чтение идет очень гладко, что на самом деле является результатом бесчисленных правок за ним. Если вы думаете, что это хорошо, пожалуйста, помогите переслать его.Большое спасибо~ Вот мой публичный аккаунт "Мы все маленькие лягушки".
буклет
Кроме того, автор также написал буклет MySQL:Ссылка на статью «Как работает MySQL: понимание MySQL у истоков». Содержание буклета в основном с точки зрения Xiaobai, с использованием относительно популярного языка для объяснения некоторых основных концепций расширенного MySQL, таких как записи, индексы, страницы, табличные пространства, оптимизация запросов, транзакции и блокировки и т. д. количество слов составляет от 300 000 до 400 000 слов, с сотнями оригинальных иллюстраций. Основная цель состоит в том, чтобы облегчить обычным программистам изучение MySQL для продвинутых пользователей и сделать кривую обучения немного более плавной. Студенты, у которых есть сомнения относительно MySQL для продвинутых пользователей, могут взглянуть на: