「MySQL」InnoDB中的页

以查询数据为例,数据库在查询n条数据时,往往会将多余n条的数据从磁盘中拿到内存中以提升查询速度。这些拿到内存中的数据就被存放到数据页中。

页的基本概念

InnoDB中页(page)是存储的基本结构,也是InnoDB管理的最小单位,与数据库相关的内容都存储在page结构中。
page分为几个类型:数据页(B-Tree Node)、Undo页(Undo Log Page)、系统页(System page)、事务数据页(Teansaction System Page)等。
InnoDB中每页的大小为16kb,每个Page使用一个32位的int值来表示,正好对应InnoDB最大64TB的存储容量(16kb*2^32=64tib)

Page的基本结构

一个Page的基本结构如下:

「MySQL」InnoDB中的页

主体数据

在Page的主体部分,主要关注数据和索引的存储,他们都位于User Records部分,User Records占据Page的大部分空间,User Records由一条条的的Record组成,每条记录代表索引树上的一个节点。

User Record

User Record在Page内以单链表的形式存在,最初数据是按照插入的先后顺序排列的,但是随着新数据的插入和旧数据的删除,数据的物理顺序发生来改变,但是他们依然保持着逻辑上的先后顺序。

「MySQL」InnoDB中的页

把User Record组织形式和若干Page组织起来,就得到来稍微完整的形式
「MySQL」InnoDB中的页

如何定位一个Record

首先通过根结点开始遍历一个索引的B+树,通过各层非叶子节点达到叶子结点的数据页,这个page内部存放的都是叶子节点。
之后在Page内部从开始节点遍历Record单链表,如果找到Record则返回,如果没找到就借助page页的next page指针,跳转到下一个page中从开始节点再次遍历Record单链表。

「MySQL」InnoDB中的页

这里要注意,page和B+树之间并没有一一对应的关系,page只是作为一个Record的保存容器(工具人),它存在的目的是便于对磁盘空间进行批量的管理。