• 9.2.4 【MySQL】段的结构


    段不对应表空间中某一个连续的物理区域,而是一个逻辑上的概念,由若干个零散的页面以及一些完整的区组成。像每个区都有对应的XDES Entry来记录这个区中的属性一样,定义了一个INODE Entry结构来记录段中的属性。

    它的各个部分释义如下:

    Segment ID

    就是指这个 INODE Entry 结构对应的段的编号(ID)。

    NOT_FULL_N_USED

    这个字段指的是在 NOT_FULL 链表中已经使用了多少个页面。下次从 NOT_FULL 链表分配空闲页面时可以直接根据这个字段的值定位到。而不用从链表中的第一个页面开始遍历着寻找空闲页面。

    List Base Node

    分别为段的 FREE 链表、 NOT_FULL 链表、 FULL 链表定义了 List Base Node ,这样我们想查找某个段的某个链表的头节点和尾节点的时候,就可以直接到这个部分找到对应链表的 List Base Node 。

    Magic Number :

    这个值是用来标记这个 INODE Entry 是否已经被初始化了(初始化的意思就是把各个字段的值都填进去了)。如果这个数字是值的 97937874 ,表明该 INODE Entry 已经初始化,否则没有被初始化。

    Fragment Array Entry

    每个 Fragment Array Entry 结构都对应着一个零散的页面,这个结构一共4个字节,表示一个零散页面的页号。

    9.2.5 各类型页面详细情况

    9.2.5.1 FSP_HDR 类型

    首先看第一个组的第一个页面,当然也是表空间的第一个页面,页号为 0 。这个页面的类型是 FSP_HDR ,它存储了表空间的一些整体属性以及第一个组内256个区的对应的 XDES Entry 结构,直接看这个类型的页面的示意图:

    从图中可以看出,一个完整的 FSP_HDR 类型的页面大致由5个部分组成,各个部分的具体释义如下表:

    名称

    中文名

    占用空间大小

    简单描述

    file header

    文件头部

    38字节

    页的一些通用信息

    file space header

    表空间头部

    112 字节

    表空间的一些整体属性信息

    XDES Entry

    区描述信息

    10240 字节

    存储本组256个区对应的属性信息

    Empty Space

    尚未使用空间

    5986 字节

    用于页结构的填充,没啥实际意义

    File Trailer

    文件尾部

    8 字节

    8 字节

    File Space Header部分

    下面是各个属性的简单描述:

    名称

    占用空间大小

    描述

    Space ID

    4字节

    表空间的ID

    Not Used

    4字节

    这4个字节未被使用,可以忽略

    Size

    4字节

    当前表空间占有的页面数

    FREE Limit

    4字节

    尚未被初始化的最小页号,大于或等于这个页号的区对应的XDES Entry结构都没有被加入FREE链表

    Space Flags

    4字节

    表空间的一些占用存储空间比较小的属性

    FRAG_N_USED

    4字节

    FREE_FRAG链表中已使用的页面数量

    List Base Node for FREE List

    16字节

    FREE链表的基节点

    List Base Node for FREE_FRAGList

    16字节

    FREE_FREG链表的基节点

    List Base Node for FULL_FRAGList

    16字节

    FULL_FREG链表的基节点

    Next Unused Segment ID

    16字节

    当前表空间中下一个未使用的 Segment ID

    List Base Node forSEG_INODES_FULL List

    16字节

    SEG_INODES_FULL链表的基节点

    List Base Node forSEG_INODES_FREE List

    16字节

    SEG_INODES_FREE链表的基节点

    List Base Node for FREE List 、 List Base Node for FREE_FRAG List 、 List Base Node forFULL_FRAG List,这三个分别是直属于表空间的 FREE 链表的基节点、 FREE_FRAG 链表的基节点、FULL_FRAG 链表的基节点,这三个链表的基节点在表空间的位置是固定的,就是在表空间的第一个页面(也就是 FSP_HDR 类型的页面)的 File Space Header 部分。

    FRAG_N_USED

    这个字段表明在 FREE_FRAG 链表中已经使用的页面数量,方便之后在链表中查找空闲的页面。

    FREE Limit

    表空间对应着具体的磁盘文件,创建表空间的时候对应的磁盘文件中都没有数据,所以我们需要对表空间完成一个初始化操作,包括为表空间中的区建立 XDES Entry 结构,为各个段建立INODE Entry 结构,建立各种链表等操作。一开始为表空间申请的空间,实际上绝大部分都是空的,我们可以选择吧所有的空闲区,对应的 XDES Entry 结构加入FREE 链表,也可以选择只把一部分的空闲区加入 FREE 链表,等啥时候空闲链表中的 XDES Entry 结构对应的区不够使了,再把之前没有加入 FREE 链表的空闲区对应的 XDES Entry 结构加入 FREE 链表,中心思想就是啥时候用到啥时候初始化,为表空间定义了 FREE Limit 这个字段,在该字段表示的页号之前的区都被初始化了,之后的区尚未被初始化。

    Next Unused Segment ID

    表中每个索引都对应2个段,每个段都有一个唯一的ID,那当我们为某个表新创建一个索引的时候,就意味着要创建两个新的段。 NextUnused Segment ID 的字段,该字段表明当前表空间中最大的段ID的下一个ID,这样在创建新段的时候赋予新段一个唯一的ID值就直接使用这个字段的值就好。

    Space Flags

    表空间对于一些布尔类型的属性,只需要几个比特位搞定的属性都放在这个Space Flags中存储,虽然它只有4个字节,32个比特位大小,却存储了好多表空间的属性,详细情况如下表:

    |标志名称|占用的空间(单位:bit)|描述| |:--:|:--:|:--:| | POST_ANTELOPE |1|表示文件格式是否大于 ANTELOPE || ZIP_SSIZE |4|表示压缩页面的大小| | ATOMIC_BLOBS |1|表示是否自动把值非常长的字段放到BLOB页里|| PAGE_SSIZE |4|页面大小| | DATA_DIR |1|表示表空间是否是从默认的数据目录中获取的| | SHARED |1|是否为共享表空间| | TEMPORARY |1|是否为临时表空间| | ENCRYPTION |1|表空间是否加密| | UNUSED |18|没有使用到的比特位|

    List Base Node for SEG_INODES_FULL List 和 List Base Node for SEG_INODES_FREE List

    每个段对应的 INODE Entry 结构会集中存放到一个类型位 INODE 的页中,如果表空间中的段特别多,则会有多个 INODE Entry 结构,可能一个页放不下,这些 INODE 类型的页会组成两种列表:

    • SEG_INODES_FULL 链表,该链表中的 INODE 类型的页面都已经被 INODE Entry 结构填充满了,没空闲空间存放额外的 INODE Entry 了。
    • SEG_INODES_FREE 链表,该链表中的 INODE 类型的页面都已经仍有空闲空间来存放 INODE Entry 结构。

    XDES Entry部分

    XDESEntry 就是在表空间的第一个页面中保存的。我们知道一个 XDES Entry 结构的大小是40字节,但是一个页面的大小有限,只能存放有限个 XDES Entry 结构,所以我们才把256个区划分成一组,在每组的第一个页面中存放256个 XDES Entry 结构。大家回看那个 FSP_HDR 类型页面的示意图, XDES Entry 0 就对应着 extent 0 , XDESEntry 1 就对应着 extent 1 ... 依此类推, XDES Entry255 就对应着 extent 255 。

    每个区对应的XDES Entry结构的地址都是固定的。

  • 相关阅读:
    力扣leetcode 最简单的中等题 2161. 根据给定数字划分数组
    Spring WebFlux 实践
    论文管理系统设计与实现
    ssm+vue的台球厅管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。
    「C++小游戏教程」猜数游戏
    2022-12-06 mysql-innodb引擎-核心数据结构
    pgsql 创建自增ID , 指定自增ID起始值
    华为浏览器风险提示 - 解决方案
    uniapp小程序中的登录完整代码(兼容小程序和app)
    【CSS】css的background属性用法详解,background常用缩写形式
  • 原文地址:https://blog.csdn.net/qq_43714918/article/details/133178005