page 页结构
-
page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在这种Page结构里。
-
Page分为几种类型,常见的页类型有
- 数据页(B±tree Node)
- Undo页(Undo Log Page)
- 系统页(System Page)
- 事务数据页 (Transaction System Page)
-
page 页结构可分为3个部分
1.通用部分 (文件头+文件尾)
- 文件头和文件尾
- 将页的内容进行封装 ,通过文件头和文件尾校验的
CheckSum
方式来确保页的传输是完整的。 - 其中比较重要的是在文件头中的
FIL_PAGE_PREV
和FIL_PAGE_NEXT
字段,通过这两个字段,我们可以找到该页的 上一页和下一页,实际上所有页通过两个字段可以形成一条双向链表
2.记录部分 (最小和最大记录 +用户记录 + 空闲空间)
- 最小和最大记录 +用户记录 + 空闲空间
主要作用是存储记录,所以“最小和最大记录”和“用户记录”部分占了页结构的主要空间。
另外空闲空间是个灵活的部分,当有新的记录插入时,会从空闲空间中进行分配用于存储新记录
3.目录部分 (页目录)
- 页目录
- 数据页中行记录按照主键值由小到大顺序串联成一个单链表
- 页中记录是以单向链表的形式进行存储的,且单链表的链表头为最小记录,链表尾为最大记录。
- 并且为了更快速地定位到指定的行记录,通过Page Directory实现目录的功能,借助Page Directory使用二分法快速找到需要查找的行记录。
page 页分类
free page(空闲页)
空闲page,未被使用
clean page(干净页)
被使用page,数据没有被修改过
dirty page(脏页)
脏页,被使用page,数据被修改过,Page页中数据和磁盘的数据产生了不一致
page 页维护
针对上面所说的三种page类型,InnoDB通过三种链表结构来维护和管理
1.free list(管理free page)
- 空闲缓冲区,管理free page
- free链表是把所有空闲的缓冲页对应的控制块作为一个个的节点放到一个链表中, 这个链表便称之为free链表
- 基节点:free链表中只有一个基节点是不记录缓存页信息(单独申请空间)它里面就存放了free链表的
- 头节点的地址
- 尾节点的地址
- 还有free链表里当前有多少个节点
2.flush list (dirty page)
- 需要刷新到磁盘的缓冲区,管理dirty page
- 内部page按修改时间排序。
· innoDB引擎为了提高处理效率,在每次修改缓冲页后,并不是立刻把修改刷新到磁盘上,而是在未来的某个
时间点进行刷新操作.所以需要使用到uSh链表存储脏页,凡是被修改过的缓冲页对应的控制块都会作为节点加入到flush链表.
3.Iru list(管理 clean page,dirty page)
- 正在使用的缓冲区,管理clean page和dirty page
- 缓冲区以midpoint为基点,
- 前面链表称为new列表区,存放经常访问的数据(热数据区),占63%;
- 后面链表称为old列表区,存放使用较少数据(冷数据区),占37%
- 冷数据区的数据页什么时候会被转到到热数据区呢?
1.如果该数据页在LRU链表中存在时间超过1S,就将其移动到链表头部(链表指的是整个LRU链表)
2.如果该数据页在LRU链表中存在的时间短于1s,其位置不变(由于全表扫描有一个特点,就是它对某个页的频
繁访问总耗时会很短)