《MySQL怎样运行的》—InnoDB数据页结构

news2024/11/25 10:49:23

在上一篇文章中我们讲了,InnoDB的数据页是InnoDB管理存储空间的基本单位,一个页的大小基本为16kb
那你有没有疑问,就是说这个InnoDB的数据页的结构是什么样的,还有他这些结构分别有那些功能~接下来我们一一讲解

数据页的总览结构

他既然是一个数据页,那咱们总体概括它的结构的时候,就用一个书页来形容~
在这里插入图片描述
他自上而下分别是

  1. File Header 文件头部 主要作用是保存页的一些通用信息

  2. Page Header 页头部 主要作用是保存数据页的一些专有信息

  3. Inifmum+Supermum 最小记录+最大记录 两个虚拟的记录

  4. User Records 用户记录 主要作用是用户存储的记录内容

  5. Free Space 空闲空间 一些还没有使用的空间

  6. Page Directory 页目录 主要的作用是页中某些记录的相对位置 asda

  7. File Trailer 文件尾部 主要的作用是检查文件是否完整

接下来我们会就这些结构来展开以一个个的讲解,然后3+4统称为记录
下面的讲解我们可能不会按照顺序来进行,先说一下其中的重点记录(3+4)~

记录在页中的存储

我们刚刚说了3+4统称为记录,我们脑子肯定在想,这些记录在页中的流程是什么?那我们就直接上图
在这里插入图片描述
其实在一开始的时候,是没有User Records这一用户空间的,原因很简单,就是因为在一开始我们是没有在里面有任何记录的呀~
当我们添加数据之后,就会往页里面插数据,如上图,当User Records满的时候,Free Space就起作用了~但是当这个Free Space使用完了的时候,这个页就已经使用完毕了,我们就需要创建新的页来储存数据
但是我们再思考一下User Records他怎么管理这些数据的,与我们上一章的内容有关
还记得COMPACT行列式吗他是结构是什么?
是不是变长字段长度列表,NULL值列表,记录头信息,真实的数据。

在记录头信息中的秘密

我们先来回忆下记录头信息的结构
在这里插入图片描述
一共就5个字节,然后40个二进制位;
他们每个的作用

  • delete_mask: 删除标志位,很重要。若此标志位为1,代表这条记录已经被删除了。
  • min_mask:B+树非叶子节点中,索引记录的中最小记录。后面讲到索引的时候再说。
  • n_owned: 分组里面包含的记录总数,分组后面再说。
  • heap_no: 后面再说。
  • record_type:很重要,记录的类型(0-普通用户记录,1-索引记录,2-Infimum,3-Supremum)
  • next_record: 指针,指向下一条记录,很重要。

这上面不是说heap_no后面再说吗?现在就用到了,记录这个记录在页堆中的相对位置
又有疑问了,什么是堆,设计InnoDB的大叔把下面这种记录紧密排列的结构叫做堆
在这里插入图片描述
然后这个heap_no的值为什么我们没有看见0和1记录呢?
这其实是个设计者的小把戏~还记得我们之前说过的Inifmum+Supermum吗?
最小记录与最大记录,他们其实是这个设计者在每条记录前默认加进去的我们可以叫他为伪记录和虚拟记录~
那么我们既然提到了最小与最大,那我就有疑问记录能比较吗?
其实这里我们比较的是主键值的大小,这个东西下一章会详细解释
现在我们讲一下Inifmum与Supremum的结构
他俩的结构其实很简单,就是前面有5个字节的记录头信息+后面的8个字节大小的固定单词哈哈哈哈
Inifmum就他自己,Supermum也是他自己~
另外一点就是heap_no的记录的值在分配之后就不会发生改动了,删掉也不会动。
然后我们说几个比较重要的记录头信息
record_type:很重要,记录的类型(0-普通用户记录,1-索引记录,2-Infimum,3-Supremum)
next_record: 指针,指向下一条记录,很重要
heap_no:记录这个记录在页堆中的相对位置
在这里插入图片描述
上面的图片就比较形象了,然后就是如果你删除一条记录的时候他会发生以下事情

  1. 他的deleted_flag就会变成1
  2. next_record变成0,也就是意味这没有下一条记录了
  3. 上一条的next_record指向该记录的下一条next_record
    然后就是Suoermum的n_owned值由n变为n-1

Page Directory页目录

这个意思就比如说,我们再看书的时候是不是先看目录,这个也一样,书的目录不是分成一个一个组吗,然后找的想要看的页码,然后去找到目标,设计InnoDB的指挥者也为我们设计了一个类似的东西,制作过程就如下:

  1. 先把所有的记录分为几个组(但是不包括垃圾链表的记录)
  2. 然后每个组里的最后一个记录相当于“带头大哥”,组里其他的记录相当于“小弟”,大哥记录里面的头信息的n_owned值为组里一共有多少个记录
  3. 到现在我们没有提到目录,重头戏来了,将每个组里的最后一条记录的地址偏移量提取出来(啥是地址偏移量:就是这个记录的第0个字节到真实数据之间的距离),按照顺序储存在靠近页尾部的地方,这个地方就是页目录~,页目录里面的这些地址偏移量就叫做槽,每个槽占两个字节,页目录就是由多个槽构成的。
    在这里插入图片描述

Page Header页面头部

这个地方就是储存数据页的一些特定状态
在这里插入图片描述

File Header 文件头部

他这个地方就是存放一些通用的状态
在这里插入图片描述

File Trailer 文件尾部

就是前四个字节为校验和
后四个字节代表页最后修改时的对应LSN的后四个字节
用于校验这个文件是否完整

下一章节我们来开始第6章 B+树索引!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内部类知识点

什么是内部类? 内部类何时出现?B类是A类的一部分,且B单独存在无意义 内部类分类 成员内部类: 当内部类被private修饰后,不能用方法2 调用外部类成员变量 内部类里面有隐藏的outer this来记录 静态内部类 创建对象&…

路由引入实验(华为)

思科设备参考:路由引入实验(思科) 技术简介 路由引入技术在网络通信中起着重要的作用,能够实现不同路由协议之间的路由传递,并在路由引入时部署路由控制,实现路径或策略的控制 实验目的 不同的路由协议之…

用Intellij实现web登录页面时,servlet已经配置好了,但是还是报404

今天看到一个404问题: 用Intellij实现web登录页面时,代码如下图所示。点击运行后会跳转到浏览器,但是输入/login时,浏览器显示404,且无法在控制面板上打印内容;输入/index时,也无法在浏览器上显…

html+css 驾考首页设计

效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>17sucai - A Pen by Mark Boots</title><!-- <link rel"stylesheet" href"./style.css"> --></head>…

【源码分享】简单的404 HTML页面示例,该页面在加载时会等待2秒钟,然后自动重定向到首页

展示效果 源码 html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>404 页面未找到</title><meta http-equiv"refresh" content"2;url/"> <!-- 设置2秒后跳转到首…

[安洵杯 2019]crackMe

直接就退出程序了 找到关键函数了&#xff0c;好像用到了 hook 还有一个 嘿嘿&#xff0c;看着就是像 base64 只是 补‘’改成了‘ &#xff01; ’ 交叉引用啊&#xff0c;翻到一个应该是最后比较函数 1UTAOIkpyOSWGv/mOYFY4R!! 那一坨对 a1数组的操作没看懂 先总结一下就是…

Golang的基本使用

目录 变量的声明 Golang常用容器 defer 有趣的多态 结构体标签和reflect 反射 Golang最强的协程 channel go可能造成的内存泄露 变量的声明 方法 1:有类型,有var,不赋值 在Golang中默认值为0 方法 2:无类型,有var,赋值 方法 3:无类型,无var,赋值 多变量声明 多变…

C语言 数组——查找算法的函数实现

目录 线性查找&#xff08;Linear Search&#xff09; 线性查找的性能 猜数游戏 二分查找&#xff08;Binary Search&#xff09; 并非吹毛求疵&#xff0c;鸡蛋里挑骨头 二分查找的性能 线性查找&#xff08;Linear Search&#xff09; 不 要求数据表是已排好序的  …

AI巨头争相与Reddit合作:为何一个古老的论坛成为AI训练的“宝藏”?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

这种电脑原来这么耗电……震惊了粉丝小姐姐

前言 在今年1月份的时候&#xff0c;一位来自重庆的小姐姐加了小白&#xff0c;咨询电脑的问题&#xff1a; 哦豁&#xff0c;这个电脑看着确实闪闪发光&#xff0c;是真的很漂亮&#xff5e;&#xff08;嗯&#xff0c;小姐姐也很漂亮&#xff09; 电脑无法开机&#xff0c;按…

华为云发布ServiceStage:内置优秀业界实践「云应用管理和运维」模板

迅猛发展的业务让企业IT系统架构愈加复杂&#xff0c;为满足业务快速迭代的需求&#xff0c;重点企业完成从传统单体应用架构到分布式微服务架构的升级。微服务架构虽可提升研发效率&#xff0c;但数量庞大的微服务实例间错综复杂的依赖关系无疑增加了部署运维难度。 同时&…

Go源码--sync库(1)sync.Once和

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

汇编语言(STC89C52)

指令是计算机计算CPU根据人的意图来执行某种操作的命令。一台计算机所执行的全部指令的集合&#xff0c;称为这个CPU的指令系统。而想要使计算机按照人们的要求完成一项工作&#xff0c;就必须让CPU按顺序执行预设的操作&#xff0c;即逐条执行人们编写的指令。这种按照人民要求…

暴雨信息液冷计算解决方案亮相CCIG 2024

5月24日&#xff0c;2024中国图象图形大会&#xff08;CCIG&#xff09;在陕西西安正式开幕。作为涵盖图像图形各专业领域的综合性的全国性学术会议&#xff0c;CCIG面向开放创新、交叉融合的发展趋势&#xff0c;为图像图形相关领域的专家学者和产业界的同仁&#xff0c;搭建了…

本是梦中人,常作花下客。心中自往来,知我有几个。

我们总是喜欢拿“顺其自然”来敷衍人生道路上的荆棘坎坷&#xff0c;却很少承认&#xff0c;真正的顺其自然&#xff0c; 其实是竭尽所能之后的不强求&#xff0c; 而非两手一摊的不作为。 一花凋零荒芜不了整个春天&#xff0c; 一次挫折也荒废不了整个人生。 多年后&#x…

头歌openGauss-存储过程第1关:创建存储过程

编程要求 1、创建第1个存储过程&#xff0c;并调用&#xff1b; 1&#xff09;创建存储过程&#xff0c;查询emp表数据&#xff1b; 2&#xff09;调用存储过程&#xff1b; --创建存储过程&#xff0c;获得计算机&#xff08;cs&#xff09;系学生选课情况并将结果写入临时表t…

免费wordpress中文主题

免费大图wordpress主题 首页是一张大图的免费wordpress主题模板。简洁实用&#xff0c;易上手。 https://www.jianzhanpress.com/?p5857 免费WP模板下载 顶部左侧导航条的免费WP模板&#xff0c;后台简洁&#xff0c;新手也可以下载使用。 https://www.jianzhanpress.com/…

d20(184-190)-勇敢开始Java,咖啡拯救人生

目录 网络通信 网络通信三要素&#xff08;IP地址&#xff0c;端口号&#xff0c;协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…

【MYSQL】分数排名

表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- id 是该表的主键&#xff08;有不同值的列&#xff09;。 该表的每一行都包含了一场比赛的分数。Score 是…