当前位置:Gxlcms > 数据库问题 > Mysql InnoDb 存储结构

Mysql InnoDb 存储结构

时间:2021-07-01 10:21:17 帮助过:18人阅读

InnoDb存储结构说明

 

技术图片

 

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

  • 段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引、表、回滚段的基本元素。注意,逻辑概念而非物理存储

  • 簇的大小是固定的(1M=64*16k)。簇默认是由64个连续的页组成的,每个页大小为16KB。

  • 默认是16KB,可以通过参数innodb_page_size修改页的大小。在逻辑上(页面号都是从小到大连续的)及物理上都是连续的。在向表中插入数据时,如果一个页面已经被写完,系统会从当前簇中分配一个新的空闲页面处理使用,如果当前簇中的64个页面都被分配完,系统会从当前页面所在段中分配一个新的簇,然后再从这个簇中分配一个新的页面来使用。

  • 行我们单独说明

文件的组织形式

技术图片

 

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

 

三种page类型:

  • FIL_PAGE_TYPE_FSP_HDR

  • FIL_PAGE_TYPE_XDES

  • FIL_PAGE_INODE

数据文件的第一个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都是在表空间存储层面,还没有具体到实际数据的存储。

Mysql InnoDb 存储结构

标签:blog   基本   读书总结   转移   base   _id   解释   不同的   macro   

人气教程排行