您当前的位置: 首页 >  sql

小志的博客

暂无认证

  • 4浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MySQL——页的理解

小志的博客 发布时间:2021-10-29 23:14:44 ,浏览量:4

目录
    • 一、MySQL中页的概述
    • 二、InnoDB存储引擎中数据页的结构示意图
    • 三、记录在数据页中的存储方式
      • 1、行格式或者记录格式的理解
      • 2、记录在页中的存储示意图
      • 3、记录在页中的存储整个流程
    • 四、记录头信息的理解
      • 1、COMPACT行格式示意图
      • 2、记录头信息的说明

一、MySQL中页的概述
  • 为了避免一条一条读取磁盘数据,InnoDB采取页的方式,作为磁盘和内存之间交互的基本单位。
  • 一个页的大小一般是16KB。
  • InnoDB为了不同的目的而设计了多种不同类型的页。比如:存放表空间头部信息的页、存放undo日志信息的页等等。
  • 存放表中数据记录的页,称为索引页或者数据页。
二、InnoDB存储引擎中数据页的结构示意图

在这里插入图片描述

三、记录在数据页中的存储方式 1、行格式或者记录格式的理解
  • 我们平时都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放形式也被称为行格式或者记录格式。。
2、记录在页中的存储示意图

在这里插入图片描述

3、记录在页中的存储整个流程
  • 上如示意图可知:
  • 在一开始生成页的时候,没有UserRecords部分。
  • 当插入一条记录时,就会从Free Space中申请一个记录大小的空间,并将这个空间划分到User Records部分。
  • 当Free Space部分的空间全部都被User Records部分替代掉后,则这个页使用完了,如果再有新的记录插入,则需要去申请新的页了。
四、记录头信息的理解 1、COMPACT行格式示意图

在这里插入图片描述

2、记录头信息的说明
  1. deleted_flag:删除标记。0:未删除 1:已删除 1.1、为什么被删除的记录还在页中?或者说,依然在磁盘上?

    这些被删除的记录之所以没有从磁盘上删除,是因为如果移除了,还需要在磁盘上重新
    排列剩余的记录,这会带来一定的性能消耗,所以只是打了一个删除的标记就可以避免重排。
    然后所有的被删除掉的记录会组成一个垃圾链表,记录在这个链表中占用的空间被称为可重
    用空间。之后若是有新的记录插入到表中,它们就可以覆盖掉被删除的这些记录占用的存储
    空间了。
    
  2. min_rec_flag:B+树中每层非叶子节点中的最小的目录项记录,都会添加该标记。

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

  4. 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的部分。
    
  5. record_type:表示当前的记录类型。 5.1、0:普通记录 5.2、1:B+树非叶子节点的目录项记录 5.3、2:表示Infimum记录 5.4、3:表示Supremum记录

  6. 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并不会因此申请新的存储空间,而是直接恢复原来被删除记录的存储空间。
    
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.1915s