Краткий ответ
В: Если данные извлекаются из кластерного индекса, не происходит ли ввод-вывод с физического диска?
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 на (примерно) наименее недавно использованный алгоритм. Это делает подсчет ввода-вывода практически невозможным. Итак, я оцениваю.