• InnoDB 数据页结构


    InnoDB 数据页结构

    MySQL 中规定一个页中至少要存放两行记录

    image-20221113222720341

    Infimum记录是一个页面中最小的记录;Supremum记录是一个页面中最大的记录。(由5字节大小的记录头信息和8字节大小的一个固定单词组成,人为规定)

    image-20221113222745297

    InfimumSupremum记录的heap_no值分别为0和1。

    堆中记录的heap_no值一旦分配便不可改变,即使记录被删除,该删除记录的heap_no值也依旧保持不变

    next_record值记录从当前记录的真实数据到下一条记录的真实数据的距离(下一条数据指按照主键值从小到大排序的下一条记录)

    image-20221113222759236+

    next_record指向真实数据开始的位置,该位置向左是记录头信息,向右是真实数据,这便与之前行结构部分变长字段列表、NULL值列表逆序存放相对应。

    删除一条记录时

    1. 该条记录的deleted_flag值设置为1
    2. 该条记录的上一条数据的next_record值修改为该条记录的next_record
    3. 该条记录的next_record值为0
    4. Supremun记录的n_owned值减小1

    页目录

    1. 将所有记录(包括SupremumInfimum)划分为几个组。
    2. 每个组最后一条记录的n_owned属性表示该组内有几条记录。
    3. 将每组最后一条数据在页面中的地址偏移量单独提取出来按顺序放在靠近页尾部的地方(Page Dictionary页目录)。页目录中的地址偏移量称为Slot)每个槽占2字节.页目录就是由多个槽组成。

    每个分组的记录条数有以下规定:

    1. 对于Infimum记录所在的分组只能有一条记录
    2. Supremum记录所在的分组拥有的记录条数只能在1-8之间
    3. 其他分组中记录的条数范围在4-8之间

    给记录进行分组的步骤:

    1. 初始情况页面中只有InfimumSupremum两条记录,它们分属于两个分组。页目录中只有两个记录Infimum和Supremum记录偏移量的槽
    2. 每插入一条记录,都会从页目录中找到对应记录主键值比待插入记录的主键值大并且差值最小的槽,并将该槽的n_owned值加1
    3. 当一个组中的记录数等于8时,再插入一条记录便会将这两个组拆分为分别包含四条记录和五条记录的两个组。

    页的效验和

    File Header中的FIL_PAGE_LSN,表示页面被最后修改时对应的日志序列号的值

    在将页从内存刷新到磁盘时,为保证页的完整性,页首和页尾都会存储页中数据的校验和,以及页面最后修改时对应的LSN值(页尾只会存储LSN值的后4字节)。若页首和页尾的校验和以及LSN值校验不成功,就说明刷新期间出现了问题。

  • 相关阅读:
    MyBatisPlus实现连表操作、批量处理
    别试错了,是该关注一下软件内在质量了
    Matlab:Matlab编程语言的简介、安装、学习路线(几十项代码编程案例分析)之详细攻略
    数据结构 - 2(顺序表10000字详解)
    【LeetCode链表相关】
    EN 14846建筑五金件锁和闩锁—CE认证
    二维卡通数字人解决方案
    【Java 进阶篇】深入理解 Bootstrap 导航条与分页条
    HLS入门实践
    想要精通算法和SQL的成长之路 - 最长等差数列
  • 原文地址:https://blog.csdn.net/qq_46039856/article/details/127839193