Mysql 学习(七)独立表结构存储 一

news2024/9/24 0:29:01

独立表空间结构

  • InnoDB有很多类型表空间,这边主要是介绍独立表空间结构,因为这种会用的比较多
  • 讲之前我们先思考一个问题,如果我们以页为单位来分配存储空间的话,那两个页之间的物理距离可能很远,因为这是随机的,而这些数据存储到磁盘上的,从磁盘加载是很消耗性能,而这些加载分为顺序IO和随机IO,顺序IO肯定是更快的,所以我们需要保证数据页尽量在一起,怎么做才能尽量保证数据页尽量在一起呢?
  • 这个时候就需要推出区 和 段的概念
  • 我们先从宏观的角度初略的介绍 区 和 段
    • 区是由64个页组成的,也就是说默认一个区占用1MB空间大小,也就是说在表的数据量比较大的时候,为某个索引分配空间的时候就按照 区 为单位去分配,这样就可以保证页的物理地址连续,加载的时候更有可能是顺序IO
    • 段其实是一个逻辑上的概念,由若干个零散的页和完整的区组成的,段的诞生主要是因为,如果索引节点所有的页类型都放入区中的话,就有可能造成数据页虽然连续,但是叶子节点和非叶子结点都会在一起,遍历的话就不合适了,所以我们尽量把叶子节点和非叶子节点分开放,这个时候就需要段的概念了,存放叶子节点的区的集合就算是一个段,存放非叶子节点的区的集合也算是一个段。也就是说一个索引会生成2个段,一个叶子节点段,一个非叶子节点段。

  • 区,上面说了区的诞生是为了更好的管理页,所以一个区存储了64个页,然后每256个区就划分成一组,具体结构如下图
    在这里插入图片描述
  • 为什么分了区之后还要分组呢?
  • 原因是更好管理,因为这些组的前两页都会存放对应组相关信息,至于存储了那些信息我们下面会讲
    在这里插入图片描述
  • 从上面我们可以知道每个分组的第一个区的前两页的信息是有差别的,主要的差别是第一组跟其他组的存放信息不一样,我们一一来看不同页的类型
    • FSP_HDR 类型:用来登记整个表空间的一些整体属性以及本组所有的区,也就是extent 0 ~ extent 255这256个区的属性,并且整个表空间只有一个FSP_HDR 类型的页
    • IBUF_BITMAP类型:
    • INODE类型:
    • XDES类型:全称是extent descriptor,用来登记本组256个区的属性,也就是说对于在extent 256区中的该类型页存储的就是extent 256 ~ extent 511这些区的属性,对于在extent 512区中的该类型页存储的就是extent 512 ~ extent 767这些区的属性。
  • 现在我们回到区的概念,最上面我们讲过当数据量比较大的时候,我们就会通过区为单位存放数据,但是这样的话会产生很多碎片页,也就是说可能一个区只存了一半的数据页,剩下一半空闲着,这对存储来说利用率就太低了,所以我们会把这些剩余的区域叫做碎片区,也就是在一个碎片区中,并不是所有的页都是为了存储同一个段的数据而存在的,而是碎片区中的页可以用于不同的目的。
  • 所以此后为某个段分配存储空间的策略是这样的:
    • 在刚开始向表中插入数据的时候,段是从某个碎片区以单个页为单位来分配存储空间的。
    • 当某个段已经占用了32个碎片区页之后,就会以完整的区为单位来分配存储空间。

区的分类

  • 上面一大串来说,独立表空间其实是由若干个区组成的,所以各个区之间肯定也会有类型分类,下面我们就来讨论一下
  • 区的类型主要分为4类:
    • 空闲的区(FREE):现在还没有用到这个区中的任何页。
    • 有剩余空间的碎片区(FREE_FRAG):表示碎片区中还有可用的页。
    • 没有剩余空间的碎片区(FULL_FRAG):表示碎片区中的所有页都被使用,没有空闲页。
    • 附属于某个段的区(FSEG):每一个索引都可以分为叶子节点段和非叶子节点段,除此之外InnoDB还会另外定义一些特殊作用的段,在这些段中的数据量很大时将使用区来作为基本的分配单位。
  • 也就是区的类型处于FREE、FREE_FRAG以及FULL_FRAG这三种状态的区都是独立的,算是直属于表空间;而处于FSEG状态的区是附属于某个段的。

区类型的结构

  • 为了方便管理这些区,每个区都对应着一个 称为XDES Entry的结构,如下图:
    在这里插入图片描述
    • Segment ID(8字节):段编号,属于是该区分配给哪个段了
    • List Node(12字节):链表信息的字段,主要是为了指向前一个区和后一个区,将区与区之间变成一个双向链表,也就是说 XDES Entry 也是一个链表
      • Pre Node Page Number和Pre Node Offset的组合就是指向前一个XDES Entry的指针
      • Next Node Page Number和Next Node Offset的组合就是指向后一个XDES Entry的指针。
    • State(4字节):这个区的类别,也就是上面说的FREE、FREE_FRAG、FULL_FRAG和FSEG
    • Page State Bitmap(16字节):这个部分共占用16个字节,也就是128个比特位。我们说一个区默认有64个页,这128个比特位被划分为64个部分,每个部分2个比特位,对应区中的一个页。这两个比特位的第一个位表示对应的页是否是空闲的,第二个比特位还没有用。
  • 下面我们就来看看,为什么提出这个XDES Entry的结构?
  • 我们知道提出区和段是为了提高插入大量数据的效率,并且
    又不至于数据量少的表浪费空间,现在我们知道向表中插入数据本质上就是向表中各个索引的叶子节点段、非叶子节点段插入数据,也知道了不同的区有不同的状态,再回到最初的起点,捋一捋向某个段中插入数据的过程:
    • 一般分为两种情况,看段内的数据多少,一般判断条件是段内数据页是否占满32个
      • 如果没有占满,首先会看段中是否有FREE_FRAG 也就是碎片区
        • 如果有则使用
        • 如果没有,则申请状态为FREE ,空闲区来存储,并且将这个区域的状态改为FREE_FRAG 碎片区,如果刚好满了则将区的状态改为FULL_FRAG
      • 如果有,我们就会申请完整的区来存放数据,也就是状态为FREE
  • 以上流程有个问题,我们如何更快更方便的知道那些区是空闲,那些区是碎片区?
  • 答案是XDES Entry 这个结构体,你想我们如果把所有空闲区变成这个链表,每次都获取头部,是不是简单多了,包括碎片区也同样,这样的话我们就可以根据 FREE,FREE_FRAG 和 FULL_FRAG 创建三个链表。
  • 这样的解决方法虽然很不错,但还有一些问题,我们怎么知道哪些区属于哪个段的呢?再遍历各个XDES Entry结构?
  • 最简单的方法就是我们把所有状态为为FSEG的区对应的XDES Entry结构都加入到一个链表
  • 但这样还有问题,不同的段哪能共用一个区呢?你想把索引a的叶子节点段和索引b的叶子节点段都存储到一个区中么?
  • 当然不能,所以我们需要根据段号 来建立链表,有多少段就建立多少链表
  • 还有问题,因为一个段中可以有好多个区,有的区是完全空闲的,有的区还有一些页可以用,有的区已经没有空闲页可以用了,所以我们有必要继续细分,设计InnoDB的大佬们为每个段中的区对应的XDES Entry结构建立了三个链表:
    • FREE链表:同一个段中,所有页都是空闲的区对应的XDES Entry结构会被加入到这个链表。注意和直属于表空间的FREE链表区别开了,此处的FREE链表是附属于某个段的。
    • NOT_FULL链表:同一个段中,仍有空闲空间的区对应的XDES Entry结构会被加入到这个链表。
    • FULL链表:同一个段中,已经没有空闲空间的区对应的XDES Entry结构会被加入到这个链表。
  • 以上我们这样的解决方式可以差不多解决管理区域的大部分问题,现在还有个问题,我们怎么找到这些链表呢,或者说怎么找到某个链表的头节点或者尾节点在表空间中的位置呢?
  • 这个时候我们就需要推出 一个 叫 List Base Node 的结构,也就是链表基节点,一般我们把某个链表对应的List Base Node结构放置在表空间中固定的位置,这样想找定位某个链表就变得简单

链表基节点

  • 每个链表都会有一个 这样的结构: 在这里插入图片描述
  • List Length表明该链表一共有多少节点,
  • First Node Page Number和First Node Offset表明该链表的头节点在表空间中的位置。
  • Last Node Page Number和Last Node Offset表明该链表的尾节点在表空间中的位置。

小结

  • 表空间是由若干个区组成的
  • 每个区对应一个XDES Entry的结构,而这个结构可以分成FREE、FREE_FRAG和FULL_FRAG 这三种类型的链表
  • 每个段可以附属若干个区,每个段中的区对应的XDES Entry结构可以分成FREE、NOT_FULL和FULL这3个链表。
  • 每个链表都对应一个List Base Node的结构,这个结构里记录了链表的头、尾节点的位置以及该链表中包含的节点数。

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

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

相关文章

2023有哪些适合学生用蓝牙耳机?300左右最好的蓝牙耳机推荐

2023年了,蓝牙耳机常常伴随手机出现在人们的日常生活当中,不管是听歌、运动、甚至玩游戏,大多数人都会选择戴蓝牙耳机。那么,有哪些适合学生用的蓝牙耳机?针对这个问题,我来给大家推荐几款300左右最好的蓝牙…

故障分析 | 从 Insert 并发死锁分析 Insert 加锁源码逻辑

作者:李锡超 一个爱笑的江苏苏宁银行 数据库工程师,主要负责数据库日常运维、自动化建设、DMP平台运维。擅长MySQL、Python、Oracle,爱好骑行、研究技术。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得…

Python初学小知识(十四):数据分析处理库Pandas

Python初学小知识(十四):数据分析处理库Pandas 十八 Pandas1 文件读取1.1 读取csv1.2 读取txt1.3 读取excel(xlsx) 2 内容读取2.1 读取行2.2 读取列 3 数据处理3.1 加减乘除3.1.1 列 与 元素3.1.2 列 与 列 3.2 最值、…

React-Native 热更新实践

以下是基于CodePush的热更新方案的实践,有需要的可以参考一下: 一、配置appcenter 1.1 安装appcenter 安装appcenter的命令如下: npm install -g appcenter-cli /** 安装完成后 */ appcenter help /** 如果出现帮助指令说明安装成功 */安装成功之后,登录appcenter,涉…

Python——线性回归、梯度下降、正则化(原理)

目录 1 线性回归-最小二乘法(LSM) 2 梯度下降 3 数据归一化/标准化 4 过拟合和欠拟合 4.1 过拟合的处理 4.2 欠拟合的处理 5 正则化 一种通过属性的线性组合来进行预测的 线性模型 ,其目的是找到一条直线或者一个平面或者更高维的超平面, 使得预…

FPGA学习笔记(三):PLL 锁相环

在 FPGA 芯片内部集成了 PLL(phase-locked loop,锁相环),可以倍频分频,产生其它时钟类型。PLL 是 FPGA 中的重要资源,因为一个复杂的 FPGA 系统需要不同频率、相位的时钟信号,一个 FPGA 芯片中 PLL 的数量是衡量 FPGA …

CAN总线网络中为什么需要安装终端电阻?

摘要: 为什么CAN总线网络中为什么需要安装终端电阻? ​在详解CAN总线:高速CAN总线和低速CAN总线的特性​文章中,高速CAN网络和低速CAN网络都需要安装终端电阻。 详解CAN总线:高速CAN总线和低速CAN总线的特性 高速CA…

HTB_Netmon CVE-2018-9276 RCE漏洞复现

文章目录 信息收集解题创建用户exppowershell脚本 信息收集 扫描结果还是很丰富的 nmap -sC -sV -p- -T4 ip ftp服务直接允许匿名登录了,直接连接,翻目录,在 Users/Public/里就看到了 user flag,get命令保存到本地查看&#xff0…

Vue3父组件向子组件传值之ArticleItem组件的封装与使用

组件概念 官方文档:组件基础 本节核心内容:组件的封装与传值 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构: 这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的组件模型,使我们…

易点易动固定资产管理平台如何帮助高校精准管理海量固定资产

高校拥有大量的固定资产,如教室、实验室、办公设备、体育设备等,这些资产数量庞大,分布广泛,管理难度大。传统的管理方式效率低下,难以实现精准和动态管理。易点易动固定资产管理平台利用现代信息技术,为高校提供一套智能化的资产管理解决方案,实现固定资产全流程的精准管理。 …

马云上三路和下三路

马云的上三路、下三路,马云最牛搭档总结 马云刚最牛搭档:蔡崇信,关明生 《关乎天下》是关明生写的一本书 趣讲大白话:没有方法走不远 【趣讲信息科技143期】 **************************** 马云上三路:使命&#xff0c…

为什么要选择付费SSL证书?免费和付费SSL证书的区别是什么?

近几年,由于互联网的发展与新冠疫情的影响,线上教育、线上办公、线上学习等逐渐融入我们的生活。但与此同时,信息数据泄露等网络安全问题也日益突出,为了保护企业与用户的隐私信息,越来越多的公司选择安装SSL证书来保护…

渲染02-内置Uniform

参考: CesiumJS 源码杂谈 - 从光到 Uniform 渲染02-内置Uniform 1 Unifrom 的接口 路径: pacaages/engin/Source/Renderer/AutomaticUniforms.js AutomaticUniforms 实际上是 Cesium 暴露给着色使用的接口集合。 AutomaticUniforms┖ AutomaticUniform(czm_projection/czm…

【Maven】Maven的打包方式和执行jar

Maven的打包方式和执行jar 1. Jar1.1 Pom.xml1.2 Run1.3 自动执行方法 2. Assembl1y2.1 Pom.xml2.2 Run2.3 要执行的方法 3. Awakening 1. Jar 1.1 Pom.xml <plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-co…

2024年浙大MBA提面申请细则及条件详解

中文MBA项目申请 浙江大学MBA招生分提前批和常规批两类。其中&#xff0c;提前批是针对工作年限较长、管理经验较丰富的考生&#xff0c;需要在正式报名参加MBA全国联考前向浙江大学MBA教育中心提出申请并在通过审核后参加相应的面试&#xff08;具体申请和面试安排请登录浙江…

【英语】100个句子记完5500个考研单词

文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sentence 14Sentence 15Sentence 16Sentence 17Sentence 18Sentence 19Sentence 20Sentence 21Sentence 22Sente…

力扣sql中等篇练习(十一)

力扣sql中等篇练习(十一) 1 好友申请|| :谁有最多的好友 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 出现数字次数越多,就代表它的好友越多 # 对两列数据合并时 不取出合并数据,采用UNION ALL SELECT t1.id,count(*) num FROM (SELECT request…

低功耗设计方法学——篇Ⅰ

引言 低功耗设计关乎ASIC芯片的性能稳定。对ASIC 特别是一些Soc芯片的设计有着重要的影响&#xff0c;随着集成规模的大幅度增加&#xff0c;芯片自身的功耗问题暴露也越来越明显。低功耗设计的需求和必要性也越来越值得关注。本文就《Low Power Methodology Manual For Syste…

【开发日志】2023.04 ZENO----Composite----CompNormalMap

NormalMap-Online (cpetry.github.io)https://cpetry.github.io/NormalMap-Online/ CompNormalMap 将灰度图像转换为法线贴图 将灰度图像转换为法线贴图是一种常见的技术&#xff0c;用于在实时图形渲染中增加表面细节。下面是一个简单的方法来将灰度图像转换为法线贴图&…

文件 与 IO操作

前言 本篇介绍文件的基本操作&#xff0c;认识文本文件与二进制文件的区别&#xff0c;什么是绝对路径与相对路径&#xff0c;java标志库中又是如何进行文件操作的&#xff1b;认识流对象进行简单的文件读取操作&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让…