3.InnoDB数据页结构

盛放记录的大盒子 —— InnoDB 数据页结构

1.InnoDB页简介

⻚是MySQL中磁盘和(存储引擎)内存交互的基本单位,也是存储引擎管理存储空间的基本单位。InnoDB是⼀个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。⽽真正处理数据的过程是发⽣在内存中的,所以需要把磁盘 中的数据加载到内存中,如果是处理写⼊或修改请求的话,还需要把内存中的内容刷新到磁盘上。⽽我们知道读写磁盘的速度⾮常慢,和内存读写差了⼏个数量 级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要⼀条⼀条的把记录从磁盘上读出来么?不,那样会慢死,InnoDB采取的⽅式是:将数据划分为若 ⼲个⻚,以⻚作为磁盘和内存之间交互的基本单位,InnoDB中⻚的⼤⼩⼀般为 16kb。也就是在⼀般情况下,⼀次最少从磁盘中读取16KB的内容到内存中,⼀次 最少把内存中的16KB内容刷新到磁盘中。InnoDB为了不同的⽬的⽽设计了许多种不同类型的⻚,用于存放记录的页叫做数据页或者索引页

2.数据页(索引页)

1)数据⻚代表的这块16KB⼤⼩的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-irkARJCr-1686638428943)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824095148778.png)]

2)从图中可以看出,⼀个InnoDB数据⻚的存储空间⼤致被划分成了7个部分,有的部分占⽤的字节数是确定的,有的部分占⽤的字节数是不确定的。下边我们⽤表格 的⽅式来⼤致描述⼀下这7个部分都存储⼀些啥内容:

名称中文名占用空间大小简单描述
File Header⽂件头部38字节⻚的⼀些通⽤信息,比如页的编号(随机)、记录上一页和下一页。
Page Header⻚⾯头部56字节数据⻚专有的⼀些信息
Infimum + Supremum最⼩记录和最⼤记录26字节两个虚拟的⾏记录(不是用户定义的)
User Records⽤户记录不确定实际存储的⾏记录内容(用户定义的)
Free Space空闲空间不确定数据⻚中尚未使⽤的空间
Page Directory⻚⾯⽬录不确定记录⻚中的每个分组的最大记录的相对位置,以槽(slot)为单位
File Trailer⽂件尾部8字节校验⻚是否完整

3)记录在页中的存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLVIae5U-1686638428945)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824095748964.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EflQY8qW-1686638428946)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824100205697.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHks7Mff-1686638428946)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824101554445.png)]

总结:

  • 记录在数据页中的存储是以链表的形式,根据主键从小到大分组存储,除去最小记录(单独一组)外每8个一组,超过8个就一分为二。每一组的最大记录对应Page Directory中的一个槽位

  • 查找记录时需要先找到具体的页然后再找具体的记录。根据主键查找记录时,可以使用二分法找到记录所在的槽位(对应的分组)

    然后通过行记录的记录头信息中的next_record属性遍历该槽所在分组中的各个记录

  • 新增更新记录时,如果不是自增长的主键,那么会造成记录的移动(因为要保证从小到大),这样可能就会进而导致索引重建

  • 删除记录时,不会把在内存中已经开辟好的空间干掉,等待之后有新的数据进来时,重新排列记录,这样可能就会进而导致索引重建

好的空间干掉,等待之后有新的数据进来时,重新排列记录,这样可能就会进而导致索引重建

  • File Header都有上⼀个和下⼀个⻚的编号,所以所有的数据⻚会组成⼀个双链表,顺序也是按照某一页的最小主键的大小顺序来。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值