Mysql InnoDb 存储结构

时间:2020-09-08 20:49:09   收藏:0   阅读:45

该文章是读了https://blog.csdn.net/bohu83/article/details/81086474的读书总结,感谢原作者的辛勤付出

InnoDb存储结构说明

 

技术图片

 

从上图可以看出,InnoDb的存储空间主要分为 段,簇,页,行。四大结构

文件的组织形式

技术图片

 

这个图很大,刚看会很乱的。我们慢慢地分解下

 

三种page类型:

数据文件的第一个Page类型为FIL_PAGE_TYPE_FSP_HDR,在创建一个新的表空间时进行初始化(fsp_header_init),该page同时用于跟踪随后的256个Extent(约256MB文件大小)的空间管理,所以每隔256MB就要创建一个类似的数据页,类型为FIL_PAGE_TYPE_XDES ,XDES Page除了文件头部外,其他都和FSP_HDR页具有相同的数据结构,可以称之为Extent描述页,每个Extent占用40个字节,一个XDES Page最多描述256个Extent。

解释下上面的话,FIL_PAGE_TYPE_FSP_HDR有两个作用,一个是跟踪FIL_PAGE_TYPE_XDES ,一个是跟踪FIL_PAGE_INODE。

FIL_PAGE_TYPE_XDES用来管理EXTEND的,一个FIL_PAGE_TYPE_XDES管理256个EXTEND。

FIL_PAGE_TYPE_FSP_HDR并不会直接和FIL_PAGE_TYPE_XDES有联系,FIL_PAGE_TYPE_FSP_HDR上两个指针用来跟踪EXTEND;

   
Macro bytes Desc
FSP_FREE16当一个Extent中所有page都未被使用时,放到该链表上,可以用于随后的分配
FSP_FREE_FRAG 16 FREE_FRAG链表的Base Node,通常这样的Extent中的Page可能归属于不同的segment,用于segment frag array page的分配(见下文)
FSP_FULL_FRAG 16 Extent中所有的page都被使用掉时,会放到该链表上,当有Page从该Extent释放时,则移回FREE_FRAG链表

从这几个字段的描述,该0号文件就是用来记录EXTEND的分配的。它最主要的功能就是管理EXTEND的分配。

关于FIL_PAGE_INODE,FIL_PAGE_TYPE_FSP_HDR是直接和INODE PAGE产生连接的。这里说下INODE PAGE其实也是用来管理和分配EXTEND的。但是INODE PAGE代表的是一个段,每一个表空间数据和索引都存在一起。一个表空间索引会使用两个段,索引段和数据段。INODE PAGE会记录某一个段,(一张表多个索引),属于这个段的EXTEND会组成一个单链表。

由于FIL_PAGE_TYPE_XDES就是跟踪EXTEND分配的,INODE PAGE跟踪的EXTEND其实也是由FIL_PAGE_TYPE_XDES分配的。FIL_PAGE_TYPE_FSP_HDR和FIL_PAGE_INODE都会直接指向EXTEND。

MacrobitsDesc
FSEG_INODE_PAGE_NODE 12 INODE页的链表节点,记录前后Inode Page的位置,BaseNode记录在头Page的FSP_SEG_INODES_FULL或者FSP_SEG_INODES_FREE字段。
Inode Entry 0 192 Inode记录
Inode Entry 1    
……    
Inode Entry 84    
MacrobitsDesc
FSEG_ID 8 该Inode归属的Segment ID,若值为0表示该slot未被使用
FSEG_NOT_FULL_N_USED 8 FSEG_NOT_FULL链表上被使用的Page数量
FSEG_FREE 16 完全没有被使用并分配给该Segment的Extent链表
FSEG_NOT_FULL 16 至少有一个page分配给当前Segment的Extent链表,全部用完时,转移到FSEG_FULL上,全部释放时,则归还给当前表空间FSP_FREE链表
FSEG_FULL 16 分配给当前segment且Page完全使用完的Extent链表
FSEG_MAGIC_N 4 Magic Number
FSEG_FRAG_ARR 0 4 属于该Segment的独立Page。总是先从全局分配独立的Page,当填满32个数组项时,就在每次分配时都分配一个完整的Extent,并在XDES PAGE中将其Segment ID设置为当前值
…… ……  
FSEG_FRAG_ARR 31 4 总共存储32个记录项

每一个Inode entry都可以构成一个单链表,该单链表上的节点都属于一个segment。

 

以上说的page都是在表空间存储层面,还没有具体到实际数据的存储。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!