做前端的女生压力大吗,seo sem是什么,做网站推广优化哪家好,wordpress中脑图形1. 记录头信息
上一篇博客说到每行记录都会有记录头信息#xff0c;用来记录每一行的一些属性 Compact行记录的记录头信息为例 1.1 delete_mask
这个属性标记着当前记录是否被删除#xff0c;占用1个二进制位#xff0c;值为0的时候代表记录并没有被删除#xff0c;为1的…
1. 记录头信息
上一篇博客说到每行记录都会有记录头信息用来记录每一行的一些属性 Compact行记录的记录头信息为例 1.1 delete_mask
这个属性标记着当前记录是否被删除占用1个二进制位值为0的时候代表记录并没有被删除为1的时候代表记录被删除掉了。
这些被删除的记录之所以不立即从磁盘上移除是因为移除它们之后把其他的记录在磁盘上重新排列需要性能消耗所以只是打一个删除标记而已所有被删除掉的记录都会组成一个所谓的垃圾链表在这个链表中的记录占用的空间称之为所谓的可重用空间之后如果有新记录插入到表中的话可能把这些被删除的记录占用的存储空间覆盖掉。
1.2 min_rec_mask
B树的每层非叶子节点中的最小记录都会添加该标记
1.3 heap_no
这个属性表示当前记录在本页中的位置。InnoDB会自动给每个页添加两条伪记录分别为最小记录与最大记录。这两条记录的构造十分简单都是由5字节大小的记录头信息和8字节大小的一个固定的部分组成的。由于这两条记录不是我们自己定义的记录所以它们并不存放在页的User Records部分他们被单独放在一个称为Infimum Supremum的部分。
1.4 record_type
这个属性表示当前记录的类型一共有4种类型的记录0表示普通记录1表示B树非叶节点记录2表示最小记录3表示最大记录。
1.5 next_record
它表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量。不论我们怎么对页中的记录做增删改操作InnoDB始终会维护一条记录的单链表链表中的各个节点是按照主键值由小到大的顺序连接起来的。
2. Page Directory页目录
Page Directory页目录中存放了记录的相对位置注意这里存放的是页相对位置而不是偏移量有些时候这些记录指针称为Slots槽或者目录槽Directory Slots。与其他数据库系统不同的是InnoDB并不是每个记录拥有一个槽InnoDB存储引擎的槽是一个稀疏目录sparse directory即一个槽中可能属于belong to多个记录最少属于4条记录最多属于8条记录。
Slots中记录按照键顺序存放这样可以利用二叉查找迅速找到记录的指针。假设我们有‘i’‘d’‘c’‘b’‘e’‘g’‘l’‘h’‘f’‘j’‘k’‘a’同时假设一个槽中包含4条记录则Slots中的记录可能是‘a’‘e’‘i’。
由于InnoDB存储引擎中Slots是稀疏目录二叉查找的结果只是一个粗略的结果所以InnoDB必须通过recorder header中的next_record来继续查找相关记录。同时slots很好地解释了recorder header中的n_owned值的含义即还有多少记录需要查找因为这些记录并不包括在slots中。
需要牢记的是B树索引本身并不能找到具体的一条记录B树索引能找到只是该记录所在的页。数据库把页载入内存然后通过Page Directory再进行二叉查找。只不过二叉查找的时间复杂度很低同时内存中的查找很快因此通常我们忽略了这部分查找所用的时间。
3.File Header文件头部
Page Header是专门针对数据页记录的各种状态信息比方说页里头有多少个记录了呀有多少个槽了呀。File Header针对各种类型的页都通用也就是说不同类型的页都会以File Header作为第一个组成部分它描述了一些针对各种页都通用的一些信息比方说这个页的编号是多少它的上一个页、下一个页是谁。
File Header用来记录页的一些头信息由如下8个部分组成共占用38个字节 FIL_PAGE_SPACE_OR_CHKSUM当MySQL版本小于MySQL-4.0.14该值代表该页属于哪个表空间因为如果我们没有开启innodb_file_per_table共享表空间中可能存放了许多页并且这些页属于不同的表空间。之后版本的MySQL该值代表页的checksum值一种新的checksum值。 FIL_PAGE_OFFSET表空间中页的偏移值。 FIL_PAGE_PREVFIL_PAGE_NEXT当前页的上一个页以及下一个页。BTree特性决定了叶子节点必须是双向列表。 FIL_PAGE_LSN该值代表该页最后被修改的日志序列位置LSNLog Sequence Number。 FIL_PAGE_TYPE页的类型。通常有以下几种见表4-4。请记住0x45BF该值代表了存放的数据页。 FIL_PAGE_FILE_FLUSH_LSN该值仅在数据文件中的一个页中定义代表文件至少被更新到了该LSN值。 FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID从MySQL 4.1开始该值代表页属于哪个表空间。
4.Page Header
接着File Header部分的是Page Header用来记录数据页的状态信息
为了能得到一个数据页中存储的记录的状态信息比如本页中已经存储了多少条记录第一条记录的地址是什么页目录中存储了多少个槽等等在页中定义了一个叫Page Header的部分它是页结构的第二部分这个部分占用固定的56个字节专门存储各种状态信息 PAGE_N_DIR_SLOTS在Page Directory页目录中的Slot槽数。Page Directory会在后面介绍。 PAGE_HEAP_TOP堆中第一个记录的指针。 PAGE_N_HEAP堆中的记录数。 PAGE_FREE指向空闲列表的首指针。 PAGE_GARBAGE已删除记录的字节数即行记录结构中delete flag为1的记录大小的总数。 PAGE_LAST_INSERT最后插入记录的位置。 PAGE_DIRECTION最后插入的方向。可能的取值为PAGE_LEFT0x01PAGE_RIGHT0x02PAGE_SAME_REC0x03PAGE_SAME_PAGE0x04PAGE_NO_DIRECTION0x05。 PAGE_N_DIRECTION一个方向连续插入记录的数量。 PAGE_N_RECS该页中记录的数量。 PAGE_MAX_TRX_ID修改当前页的最大事务ID注意该值仅在Secondary Index定义。 PAGE_LEVEL当前页在索引树中的位置0x00代表叶节点。 PAGE_INDEX_ID当前页属于哪个索引ID。 PAGE_BTR_SEG_LEAFB树的叶节点中文件段的首指针位置。注意该值仅在B树的Root页中定义。 PAGE_BTR_SEG_TOPB树的非叶节点中文件段的首指针位置。注意该值仅在B树的Root页中定义。
5.File Trailer
为了保证页能够完整地写入磁盘如可能发生的写入过程中磁盘损坏、机器宕机等原因InnoDB存储引擎的页中设置了File Trailer部分。
File Trailer部分这个部分由8个字节组成可以分成2个小部分
前4个字节代表页的校验和
这个部分是和File Header中的校验和相对应的。每当一个页面在内存中修改了在同步之前就要把它的校验和算出来因为File Header在页面的前边所以校验和会被首先同步到磁盘当完全写完时校验和也会被写到页的尾部如果完全同步成功则页的首部和尾部的校验和应该是一致的。如果写了一半儿断电了那么在File Header中的校验和就代表着已经修改过的页而在File Trailer中的校验和代表着原先的页二者不同则意味着同步中间出了错。
后4个字节代表页面被最后修改时对应的日志序列位置LSN
这个部分也是为了校验页的完整性的