MySQL - [11] Page — 页

Page 页。是真正理解InnoDB存储引擎的入口。

 

一、InnoDB 数据页及其结构

为了避免一条一条读取磁盘数据,InnoDB采取页的方式,作为磁盘内存之间交互的基本单位。(一个页的大小一般是16KB。)

InnoDB 为了不同的目的而设计了多种不同类型的页、存放undo日志信息的页等等。我们把存放表中数据记录的页,称为 索引页 or 数据页往数据页User Records部分)中存储数据(也叫“记录”)。

 

查看innodb_page_size大小:show variables like 'innodb_page_size';(value的值单位为byte)

 

 

二、记录的头信息

deleted_flag:逻辑删除标记(0:未删除,1:已删除)

min_rec_flag:B+树中每层非叶子节点中的最小的目录项记录,都会添加该标记。

n_owned:一个页面被分若干组后,“带头大哥”用于保存组中所有的记录条数。

heap_no:表示当前记录在页面堆中的相对位置。

record_type:表示当前的记录类型

    • ① 0:普通记录
    • ② 1:B+数非叶子节点的目录项记录
    • ③ 2:表示Infimum记录
    • ④ 3:表示Supremum记录

next_record:表示下一条记录的相对位置,也就是链表。它表示从当前记录的真实数据到下一条的真实数据的距离。

 

 

三、Page Directory概述

  记录在页中是按照主键值从小到大的顺序串联称为一个单向链表,因此查询也只能以头节点开始逐一向后查询,但是如果数据量很大,那么性能就无法保证了。针对这个问题,InnoDB采取了图书目录的解决方案,即:Page Directory

  分组规则如下所示:

  ① 对于Infimum记录所在的分组只能有1条记录。

  ② 对于Supremum记录所在的分组只能在1~8条记录之间。

  ③ 剩下的其他记录所在的分组只能在4~8条记录之间。

分组步骤如下:

① 初始情况下,一个数据页中只有Infimum记录和Supremum记录这两条,所以分为两个组

② 之后每当插入一条记录时,都会从页目录中找到对应记录的主键值比待插入记录的主键值大,并且差值最小的槽,然后把该槽对应的n_owned加1.

③ 当一个组中的记录数等于8时,当再插入一条记录的时候,会将该组中的记录拆分成两个组(一个组中4条记录,另一个组中5条记录)。并在拆分过程中,会在Page Directory中新增一个槽,并记录这个新增分组中最大的那条记录的偏移量。

 

 

 

 

 

 

 

 

— 要养成终身学习的习惯 —

posted @ 2024-04-15 15:35  HOUHUILIN  阅读(8)  评论(0编辑  收藏  举报