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

本文详细介绍了InnoDB存储引擎的表空间文件格式,包括FSP_HDR/XDESPage和fseginodesPage等核心组件。表空间以Extent组织Page,通过FSEG(段)和Inode(索引节点)进行管理。Inode用于控制Segment,Extent的分配状态由XDESentry的bitmap表示。理解这些概念有助于深入掌握InnoDB的数据存储和管理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、表空间的文件类型

表空间的文件类型其实就文件的具体类型,在前面谈到过表空间的上层逻辑分层,最下面一层是通过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甚至重写硬盘驱动,都只是加快速度而已。数据的存储和物品的存储基本一样,要想物品迅速安全的存储并在后期找到应用,就必须划定各种存储方案,其实反映到数据上,就是把数据的存储有一定的格式,复杂是格式而不是存储本身。
格式其实就是数据存储的规则,先写什么后写什么,有什么标志头、标志尾,有没有校验值,数据的大小长度等等。每一种实际的数据,可能需求不一样,可能规则就变化很大。但基本的原则是一致的,就是为了能够安全有效的快速落盘。学的多,看得多,总结的多了后,就明白了其中的关窍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值