• 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值校验不成功,就说明刷新期间出现了问题。

  • 相关阅读:
    线程池的实现
    (最优化理论与方法)第一章最优化简介-第二节:最优化典型实例之稀疏优化和低秩矩阵恢复
    【linux命令讲解大全】098.网络文件传输协议介绍及常用命令
    怎样优雅地增删查改(四):创建通用查询基类
    Unity Samples和帧动画的问题
    【无标题】
    docker常用命令大全
    智慧城市与数字孪生:共创未来城市的智慧生活
    Linux远程工具专家推荐(二)
    Codeforces Round #828 (Div. 3) (A~D)
  • 原文地址:https://blog.csdn.net/qq_46039856/article/details/127839193