innodb表空间存储结构

本文详细介绍了InnoDB存储引擎的逻辑存储结构,包括段、区和页的概念及其管理方式。探讨了不同类型的页,如数据页、undo页等,并解释了行记录的两种格式:compact和redundant。此外,还分析了页内的关键数据结构,如双向链表和单向链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储结构

*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判断)。可以看出页之间是双向链表连接(尽管可能并不是物理位置相邻)并且页中记录也是单向链表连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值