Каждый узел дерева B + InnoDB (либо данные, либо индекс) постоянно нумеруется «номером блока», который, по сути, является его местоположением в файле (.ibd
или ibdata1
). Когда узел выбирается в buffer_pool, он помещается туда, где есть место для него. Механизм поиска отображает номер блока на адрес RAM в buffer_pool.
Если этот блок будет изменен, он в конечном итоге будет записан на диск в том же месте файла.
Если этот блок разделен (например, из-за INSERTing
слишком большого количества строк в нем), тогда другой блок извлекается из свободного списка для разделения. Из-за +
в «B + Tree» это означает, что необходимо обновить пару ссылок, чтобы вставить этот новый блок в последовательную цепочку блоков B + Tree. Все это делается, пока блоки находятся в buffer_pool. И родитель этих двух узлов нуждается в обновлении и, возможно, также в разделении.
Блок, измененный по любой причине, помечается как «грязный». Фоновая задача позаботится о том, чтобы в конечном итоге записать грязные блоки на диск.
Блоки никогда (кроме совпадений) не нумеруются последовательно 1,2,3 и т. Д. «Следующий» блок может иметь любое «число». Кроме того, числа не обязательно являются монотонными, поскольку «свободный» блок для удовлетворения «разбиению» может иметь меньшее число.
Все вышеперечисленное является более сложным из-за «табличных пространств», buffer_pool_instances, расширений ibdata1, отмены, повтора, цепочки истории и других вещей.