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 存储结构