Дисковый ввод-вывод в MySQL кластерный индекс - PullRequest
1 голос
/ 24 апреля 2019

enter image description here

Я узнал, что конечный узел кластеризованного индекса в MySQL хранит данные строк.

Если данные извлекаются из кластерного индекса,не происходит физический дисковый ввод-вывод?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Краткий ответ

В: Если данные извлекаются из кластерного индекса, не происходит ли ввод-вывод с физического диска?

A: Зависит от этого.О многих вещах.

Длинный ответ

Ввод / вывод - самая медленная часть запроса.(Если все кешируется, то другие соображения становятся «худшими».) При угадывании объема операций ввода-вывода, необходимых для выполнения запроса, я хотел бы сделать следующие упрощающие предположения:

  • fanout равен 100. То есть каждый неконечный узел в BTree (данные или индекс) имеет около 100 узлов.На схеме ОП разветвление составляет всего 2 - необходимое упрощение для размещения на странице;100 более реалистично.

  • При подсчете операций ввода-вывода необходимо учитывать только конечные узлы данных.Есть много случаев, когда это чрезмерное упрощение, но в отлаженной производственной системе это достаточно хорошо.

Эти два упрощения избегают кровопролитиядетали, которые уже были указаны.Подумайте об этом - неконечные узлы данных составляют, возможно, 1% узлов BTree, поэтому производственная система, скорее всего, попадет туда, где все они кэшированы.

Для «точечного запроса» может потребоваться I/ вывода.«Запрос диапазона» может потребовать чтения одного блока на 100 прочитанных строк.Обратите внимание, что вы никогда не выполняете «диапазонные запросы» с UUID.

В InnoDB INDEX (включая UNIQUE) is very much like a clustered index, with the exception of what is in the leaf nodes. The "rows" of an INDEX contain the column(s) of the PRIMARY KEY`. Эти столбцы используются для детализацииBTree данных, чтобы добраться до остальных столбцов.

«Использование индекса» означает «индекс покрытия», что означает, что все столбцы, необходимые для SELECT, находятся вINDEX's BTree. В этом случае исключается отскок к данным BTree.

Все блоки (лист / не лист, данные / индекс) обрабатываются (почти) одинаково.из buffer_pool на (примерно) наименее недавно использованный алгоритм. Это делает подсчет ввода-вывода практически невозможным. Итак, я оцениваю.

0 голосов
/ 25 апреля 2019

InnoDB должен извлечь страницу с диска, если она еще не находится в ОЗУ в пуле буферов InnoDB .

После извлечения страница остается в пуле буферов, если она не будет удалена другими страницами или процесс MySQL Server не будет перезапущен.

Пока страница находится в пуле буферов, последующие запросы на чтение этой страницы читают ее из ОЗУ, а не осуществляют дисковый ввод-вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...