• mysql源码分析——InnoDB的磁盘结构之表空间格式


    一、表空间的文件类型

    表空间的文件类型其实就文件的具体类型,在前面谈到过表空间的上层逻辑分层,最下面一层是通过Page来实现的,也就是说,文件的底层就是通过链表来控制这个页数据。而这些页数据的具体保存到硬盘中,主要为为两类,即:
    FSP_HDR/XDES Page和fseg inodes Page。
    page的默认大小为16K,在InnoDB中extent是分配页的基本单位,每个extent包含64个Page。

    二、表空间文件格式

    表空间中一般是以Extent的形式来组织Page的,基本如下:

    在这里插入图片描述

    其可分为两种形式即XDES和FSEG,FSP_HDR/XEDS如下:

    在这里插入图片描述

    头部信息:

    在这里插入图片描述

    space id:
    当前表空间的ID
    size:
    当前space最大可容纳的page数,文件扩大时才会改变这个值
    limit:
    当前space已经分配初始化的page数,包括空闲的和已经使用的
    flag:
    未起作用
    frage used:
    FSP_FREE_FRAG列表中已经被使用的page数
    free list:
    space中可用的extent对象列表,extent里面没有一个page被使用
    frag free list :
    有可用碎页page的extent列表,exntent里面有部分page被使用
    frag full list :
    页全部使用的extent列表
    segment id:
    下一个可利用的segment id
    full inode list :
    space全满segment inode页列表
    free inode list :
    space空闲segment inode页列表

    XDE的细节:

    在这里插入图片描述

    File Segment ID:
    extent所属segment的ID
    XDES list:
    磁盘双向链表的一个节点,前后各指向一个XDES entry的page位置
    state:
    extent的状态, 值包含XDES_FREE、XDES_FREE_FRAG、XDES_FULL_FRAG、XDES_FSEG。当为XDES_FSEG的时,表示此extent已归属一个Segment;XDES_FSEG表示extent初始创建状态。XDES_FREE表示extent在刚分配时状态.
    bitmap:
    extent中page的状态索引,一个page占用2 bit,第一个bit表示占用状态,第二个bit表示清空状态,暂时未用,默认为TRUE。

    INODE PAGE整体信息:

    在这里插入图片描述

    FSEG 如下:
    在这里插入图片描述

    fseg id:
    segment ID
    not full used:
    NOT_FULL列表中的page数
    FREE:
    inode中空闲的extent列表
    NOT_FULL:
    未完全使用的extent列表
    FULL:
    完全满的extent的列表
    MAGIC_N:
    校验魔数
    FRAG ARRAY:
    长度为32个的页索引存储数组,主要用来节省空间,一般用在不完整分配Extent时。

    三、应用流程

    在InnoDB的Sapce中,inode extent page三者的关系非常紧密。Page是最基本的分配单位,但页的分配是通过Extent来组织管理的,所以Extent叫做区。而Inode又可以管理多个Extent和32个Frag Page。Inode以Segment为管理 ,也就是上面的图中的FSEG。
    Inode是从inode page的free list来申请控制,extent则有两种申请管理方式,一种是通过Fragment碎片方式管理分配,另外一种是在分配Fragpage时直接对Extent申请分配管理。在这个基础上,页的分配管理就清楚了,它可以通过 inode的方式来申请也可以通过Fragpage的方式来申请。
    最主要的代码主要在fsp0fsp.cc这个文件中,有兴趣可以认真翻看一下代码,这里就不再分析,前面在分析相关代码时,也引用了不少这里的代码。

    四、总结

    其实有过存储开发经验的编程人员,做过安全方面开发的人员都知道,各种内存的数据不管多么复杂,最终都要存储到硬盘中落盘。数据千条线,落盘的方法却只有那几个API,即使后来增加了各种DMA甚至重写硬盘驱动,都只是加快速度而已。数据的存储和物品的存储基本一样,要想物品迅速安全的存储并在后期找到应用,就必须划定各种存储方案,其实反映到数据上,就是把数据的存储有一定的格式,复杂是格式而不是存储本身。
    格式其实就是数据存储的规则,先写什么后写什么,有什么标志头、标志尾,有没有校验值,数据的大小长度等等。每一种实际的数据,可能需求不一样,可能规则就变化很大。但基本的原则是一致的,就是为了能够安全有效的快速落盘。学的多,看得多,总结的多了后,就明白了其中的关窍。

  • 相关阅读:
    单目标应用:萤火虫算法(Firefly Algorithm,FA)优化RBF神经网络实现数据预测(RBF隐藏层神经元个数可以自行设定)
    2. C++ 线程的使用
    CentOS安装Elasticsearch集群
    Android获取当前设备的内存和CPU使用情况
    c语言-快速排序
    Spring Boot 程序优化的 14 个小妙招!
    《MongoDB入门教程》第11篇 数组运算符
    38.【C语言】指针(重难点)(C)
    分数限制下,选好专业还是选好学校?过来人跟你说
    【数据结构笔记04】数据结构之栈的顺序表示和实现(顺序栈)
  • 原文地址:https://blog.csdn.net/fpcc/article/details/127818716