(十七)大白话用于存放磁盘上的多行数据的数据页到底长个什么样子?

1、数据页真正的格式是什么样子?

之前我们老是给大家提到一个概念,就是数据页,大家都知道平时我们执行crud的时候,都会从磁盘上加载数据页到Buffer Pool的缓存页里去,然后更新了缓存页后,又会刷新回磁盘上的数据页里去。

所以其实MySQL中进行数据操作的最小单位应该是数据页,那么我们之前已经给大家分析过了一行一行的数据在磁盘和缓存中存储的时候,他真正的格式是什么样子的之前介绍过。

每个数据页,实际上是默认有16kb的大小,那么这16kb的大小就是存放大量的数据行吗?

明显不是的,其实一个数据页拆分成了很多个部分,大体上来说包含了文件头、数据页头、最小记录和最大记录、多个数据行、空闲空间、数据页目录、文件尾部。

我下面有一个图,在图里包含了一个数据页的各个部分,各个部分占用的字节数如下:

  • 文件头占据了38个字节
  • 数据页头占据了56个字节
  • 最大记录和最小记录占据了26个字节
  • 数据行区域的大小是不固定的
  • 空闲区域的大小也是不固定的
  • 数据页目录的大小也是不固定的
  • 然后文件尾部占据8个字节。
    在这里插入图片描述

看完了这个数据页的结构,是不是觉得很神奇?居然冒出了这么多稀奇古怪的概念出来。

其实也没什么好奇怪的,说白了,这个数据页就跟每一行数据一样,都是由MySQL开发人员设计出来的一个特殊的存储格式。

也就是说通过这种特殊的存储格式在磁盘文件里去存放一个又一个的数据页,每个数据页在磁盘里实际存储的时候,就是包含了上述一些特殊的数据,然后每个数据页里还有专门的区域包含了多个数据行,至于每个数据行,那就是用我们之前讲解的那套存储格式来存储的了。

2、数据插入数据页的过程

接着我们给大家讲一下这个把数据插入数据页的一个过程,因为大家都知道,刚开始一个数据页可能是空的,没有一行数据的,此时这个数据页实际上是没有数据行那个区域的,也就是说,此时看起来一个空的数据页就是下面图里那样的。
在这里插入图片描述

然后我们来思考一下,假设我们现在要插入一行数据,此时数据库里可是一行数据都没有的,那么此时是不是应该先是从磁盘上加载一个空的数据页到缓存页里去?

此时空的数据页就是如上图所示,至于加载的过程,则如下图所示。

在这里插入图片描述

接着我们是不是应该在Buffer Pool中的一个空的缓存页里插入一条数据?

记住,缓存页跟数据页是一 一对应的,他在磁盘上的时候就是数据页,数据页加载到缓存页里了,我们就叫他缓存页了!

所以此时在缓存页里插入一条数据,实际上就是在数据行那个区域里插入一行数据,然后空闲区域的空间会减少一些,此时当缓存页里插入了一行数据之后,其实缓存页此时看起来如下图所示。
在这里插入图片描述

接着你就可以不停的插入数据到这个缓存页里去,直到他的空闲区域都耗尽了,就是这个页满了,此时数据行区域内可能有很多行数据,如下图所示,空闲区域就没了。

在这里插入图片描述

而且大家都知道,在更新缓存页的同时,其实他在lru链表里的位置会不停的变动,而且肯定会在flush链表里,所以最终他一定会通过后台IO线程根据lru链表和flush链表,把这个脏的缓存页刷到磁盘上去,如下图所示。

image-20221220222517611
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值