关键字: 区、段、Segment Header、链表基节点、碎片区、数据字典
9.1、区(extent)
表空间是由多个区组成的。其中的每个区都由物理位置上连续的64个页组成,因为每个页的大小为16K,所以一个区的大小是1M。
InnoDB使用XDES Entry结构来描述一个区。一个区对应着一个XDES Entry结构,XDES Entry结构存在HSP_HDR类型页和XDES类型页中。
一个XDES结构占用40字节。
(1)Segment ID:该区所属段的段id(碎片区不存在这个值)
(2)ListNode:ListNode将XDES Entry结构组成了多个链表,对于一个表空间,XDES结构共存在3+(N*3)个XDES链表,N为索引段的个数。
前3个链表是碎片区组成的链表,分别是:
1、状态state为FREE的区组成的FREE链表,
2、状态为FREE_FRAG的区组成的FREE_FRAG链表,
3、状态为FULL_FRAG的区组成的FULL_FRAG链表。
这个3个链表的基节点都存放在HSP_HDR类型页的file space header部分。
每个索引段管理的区形成了3个链表,分别是:FREE链表、NOT_FULL链表、FULL链表。这3个链表的基节点存放在INODE结构中。
(3)state:表明了区的状态,共有4种,分别是:FREE、FREE_FRAG、FULL_FRAG、FSEG。前3个状态都是碎片区的状态,第4个状态表明了这个区附属于某个段。
(4)Page State Bitmap:16个字节=128位,128位显示了这个区的64个页面是否是空闲的。
9.2、段(Segment)
段是一个逻辑概念,一个索引存在2个段,分别是叶子节点段和非叶子节点段。一个段由32个碎片区中的页+一些所属与这个段的区构成。
InnoDB使用INODE Entry结构表示一个段,一个段对应了一个INODE Entry结构。INODE结构存放在INDOE类型页中。
一个INODE Entry结构占用192字节
(1)Segment ID:段id
(2)NOT_FULL_N_USER:在NOT_FULL列表中的区已经使用了多少页面
(3)3个List Base Node:3个链表基节点,就是上面说的FREE链表、NOT_FULL链表、FULL链表,这3个链表的基节点。
(4)Magic Number:标记这个INODE Entry结构是否初始化
(5)Fragment Array Entry 0-31:32个碎片区中的页的页号。
9.3、Segment Header结构
一个组里有256个区,区中第一个页面中有256个XDES Entry结构,所以XDES Entry结构能和区中的页面一一对应上。但是一个表空间中有很多索引,而Segment Entry结构只存在INODE类型页中,怎么做到一一对应呢?
答案在B+树的根节点上,每个索引都有一颗B+树,B+树的根节点上的Page Header部分,最后20字节分别是:
(1)PAGE_BTR_SEG_LEAF(10字节):B+树的叶子节点段INODE Entry结构的位置
(2)PAGE_BTR_SEG_TOP(10字节):B+树的叶子非节点段INODE Entry结构的位置
这10个字节称为Segment Header结构
9.4、链表基节点结构
HSP_HDR类型页中有3个XDES Entry链表基节点和2个INODE类型页组成的链表基节点;
INDOE结构中有3个XDES Entry链表基节点。
链表基节点的结构如图:
一个链表基节点占用16字节。
9.5、碎片区
不属于任何段的区称为碎片区,碎片区直属于表结构,碎片区上的页可以给多个段混合使用。
一个段在申请空间的时候,一开始是一个页一个页在碎片区上以页为单位申请的,当申请的页超过32个之后,就会以区为单位来申请空间,申请下来的区就属于这个段了,这个区就只能存这个段里的数据。
9.6、InnoDB数据字典
InnoDB中存在4张基本系统表,它们是所有表的源头,所有表的基本信息都存在这里。
这4张表分别是:
1、sys_tables:所有表的信息;
2、sys_columns:所有列的表;
3、sys_indexes表:所有索引的表;
4、sys_fields:所有索引对应列的信息。
这4张表我们是查不着的,但是是存在的。
这4张表存放在数据页中,形成B+树,这4张表共有5个索引,形成5棵B+树,B+树的根节点存放在Data dictionary Header结构页中。
(1)sys_tables:所有表的信息
(name) (id) n_cols type mix_id mix_len cluster_id space
聚簇索引 二级索引
(2)sys_columns:所有列的表
(table_id pos) name mtype prtype len prec
聚簇索引
(3)sys_indexes表:所有索引表
(table_id id) name n_fields type space page_no merge_threshold
聚簇索引
(4)sys_fields:所有索引对应列的信息
(index_id pos) col_name
聚簇索引
注:sys_indexes表中的space和page_no定位了这个索引的B+树根节点的表空间号和页号。