从上图可以看出,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_FREE | 16 | 当一个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。
Macro | bits | Desc |
---|---|---|
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 |
Macro | bits | Desc |
---|---|---|
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 |