innodb表空间存储结构

存储结构

*Innodb的逻辑存储结构如图所示:

 

其空间管理由段,区和页构成。段包括叶子节点段,即所有索引的叶子节点都存储在这个段里,叶子节点存储数据(次级索引是主键)和键值,这可以方便管理并且减少随机io;还包括非叶子节点,存储的是指向另外节点的指针和键值;回滚段存储的是每个表的undo日志(具体分析可看redo&undo日志解析)。

区的大小固定为1M,不过当一个单独表空间刚申请时,仅有96kb,只有用完这些空间才会分配一整块区。

页默认为16kb,innodb存储引擎中常见的页有数据页,undo页,系统页,事务数据页,bitmap页等。

行记录格式一般为两种,一种compact,包括变长的列长度表,如果该列长度小于255字节,则该列长度用1字节表示(刚好最大值255),大于则2字节(varchar最长65535bytes,实际最多为65532字节),随后是null标记位如果该行有null值则置为1,随后是5字节记录头,其中包含了是否被删除的标记位,索引堆中排序序号,下一条记录位置等信息。是否被删除主要是用于多版本控制。随后的即为各种列数据,其中还包含两个隐藏列:事务ID列用于多版本控制,回滚指针列用于事务。另一种是redundant,跟compact的区别是没有null标记位,记录头为6字节,多了一个n_fields表明有多少列,一共10位最多1023列。当行记录溢出时(超过一页的大小),会把记录中的长字节列转换为blob页单独存储,该记录中列的位置存储指向blob页的指针。

页的头部存储的比较重要的数据有:存储了checksum,用来校验页数据是否正确;LSN,主要用在崩溃恢复时,该页redo记录的LSN跟该页的LSN比较,如果该页的LSN要大那么就不对该页做redo了避免重复恢复;还存储了前一个页和后一个页的指针,实质应该是页偏移,因为最小单位是页;存储了该页在的页偏移值;存储了页中第一条记录的指针;以及存储了一个最小记录(键值比该页中任何都要小)和一个最大记录(键值比任何一个都大);存储了最大事务id,在次级索引覆盖索引查询时可以迅速判断整页是否都可以被看见(read view判断)。可以看出页之间是双向链表连接(尽管可能并不是物理位置相邻)并且页中记录也是单向链表连接。

猜你喜欢

转载自blog.csdn.net/qq_38125183/article/details/80652479
今日推荐