目录
一、MySQL中页的概述
- 一、MySQL中页的概述
- 二、InnoDB存储引擎中数据页的结构示意图
- 三、记录在数据页中的存储方式
- 1、行格式或者记录格式的理解
- 2、记录在页中的存储示意图
- 3、记录在页中的存储整个流程
- 四、记录头信息的理解
- 1、COMPACT行格式示意图
- 2、记录头信息的说明
- 为了避免一条一条读取磁盘数据,InnoDB采取页的方式,作为磁盘和内存之间交互的基本单位。
- 一个页的大小一般是16KB。
- InnoDB为了不同的目的而设计了多种不同类型的页。比如:存放表空间头部信息的页、存放undo日志信息的页等等。
- 存放表中数据记录的页,称为索引页或者数据页。
- 我们平时都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放形式也被称为行格式或者记录格式。。
- 上如示意图可知:
- 在一开始生成页的时候,没有UserRecords部分。
- 当插入一条记录时,就会从Free Space中申请一个记录大小的空间,并将这个空间划分到User Records部分。
- 当Free Space部分的空间全部都被User Records部分替代掉后,则这个页使用完了,如果再有新的记录插入,则需要去申请新的页了。
-
deleted_flag:删除标记。0:未删除 1:已删除 1.1、为什么被删除的记录还在页中?或者说,依然在磁盘上?
这些被删除的记录之所以没有从磁盘上删除,是因为如果移除了,还需要在磁盘上重新 排列剩余的记录,这会带来一定的性能消耗,所以只是打了一个删除的标记就可以避免重排。 然后所有的被删除掉的记录会组成一个垃圾链表,记录在这个链表中占用的空间被称为可重 用空间。之后若是有新的记录插入到表中,它们就可以覆盖掉被删除的这些记录占用的存储 空间了。
-
min_rec_flag:B+树中每层非叶子节点中的最小的目录项记录,都会添加该标记。
-
n_owned:一个页面被分若干组后,“带头大哥”用于保存组中所有的记录条数。
-
heap_no:表示当前记录在页面堆中的相对位置。 4.1、什么叫页面堆?heap_no作用是什么?
页面堆: 我们向表中插入的记录都会放到User Record部分,这些记录一条条的连续排列 着,InnoDB将此连续排列的结构称之为堆(heap)。 heap_no: 为了方便管理,他们把一条记录在堆中的相对位置称之为heap_no。 heap_no作用: 堆中记录的heap_no值在分配之后就不会发生改动了,即使删除了堆中的 某条记录,这条被删除记录的heap_no值页仍然保持不变。
4.2、为什么用户记录的heap_no从2开始?见下图学生信息表
因为创建页时,每个页会自动添加两条记录,且都没有主键值: 一条代表页面中最小记录(即:比任何用户记录都小)——Infimum记录,heap_no=0 另一条代表页面中的最大记录(即:比任何用户记录都大)——Supremum记录,heap_no=1 为了区分这两条默认记录和用户自己插入的记录,将这两条记录放到一个称为 Infimum+Supremum的部分。
-
record_type:表示当前的记录类型。 5.1、0:普通记录 5.2、1:B+树非叶子节点的目录项记录 5.3、2:表示Infimum记录 5.4、3:表示Supremum记录
-
next_record:表示下一条记录的相对位置。就是链表。这个属性非常重要。它表示从当前记录的真实数据到下一条记录的真实数据的距离。如下所示:
6.1、为什么要指向「记录头信息」和「真实数据之间」 的位置呢?而不是指向整条记录的开头位置?
因为这个位置刚刚好,向左读取就是记录头信息;向右读取就是真实数据。
6.2、next_record属性为正数和负数表示什么?
该属性为正数——说明当前记录的下一条记录在它的后面。 该属性为负数——说明当前记录的下一条记录在它的前面。
比如:一条记录的next_record值为32,意味着从当前记录的真实数据的地址处向后找32 字节便是下一条记录的真实数据。其中:「下一条记录」指的是按主键值由小到大的顺序 排列的下一条记录。
6.3、通过下图,可以看出记录是按照主键从小到大的顺序形成了一个单向链表。并且,记录被删除对next_record的影响,如下图所示:
deleted_flag变为了1,但是并没有从磁盘中删除。 next_record变为了0,意味着没有下一条记录了。 “tom”的next_record指向了“bob”。 supremum记录的n_owned变为了4。 如果再次执行插入操作 insert into tb_student values(3, 300, "jack");操作, InnoDB并不会因此申请新的存储空间,而是直接恢复原来被删除记录的存储空间。