深入理解InnoDB(6)—独立表空间

InnoDB的表空间

image.png
表空间可以看做是InnoDB存储引擎逻辑结构的最高层 ,所有的数据都是存放在表空间中。

1. Extent

对于16KB的页来说,连续的64个页就是一个区,也就是说一个区默认占用1MB空间大小。

每256个区被划分成一组,第一组的前3个页面是固定的(FSP_HDR,IBUF_BITMAP,INODE),每组的前两个页面是固定的(XDES,IBUF_BITMAP)

1.1 为什么需要引入区的概念?

因为B+树的每一层的节点,都是用一个双向链表连起来的,如果以页作为存储单位的话,在B+树上相邻的两个节点,可能在磁盘上相隔非常远,就会造成磁盘的随机I/O,因此我们应该使得相邻位置的节点,物理位置也尽量相连,形成顺序I/O。

所以,所以才引入了区(extent)的概念,一个区就是在物理位置上连续的64个页。在表中数据量大的时候,为某个索引分配空间的时候就不再按照页为单位分配了,而是按照区为单位分配

1.2 区的分类

  • FREE 空闲的区
  • FREE_FRAG 有剩余空间的碎片区
  • FULL_FRAG 没有剩余空间的碎片区
  • FSEG 附属于某个段的区
    注意:处于FREE、FREE_FRAG以及FULL_FRAG这三种状态的区都是独立的,算是直属于表空间;而处于FSEG状态的区是附属于某个段的。

1.3 XDES Entry

每一个区都对应着一个XDES Entry结构.XDES Entry的组成如下图

image.png

  • Segment ID(8字节)
    该区所属的段的ID
  • List Node(12字节)
    将XDES Entry连成一个链表,存储的是指向上一个XDES和下一个XDES的指针
  • State(4字节)
    前面说到的几种区的分类,FREE、FREE_FRAG、FULL_FRAG和FSEG
  • Page State Bitmap(16字节)
    这个部分共占用16个字节,也就是128个比特位。我们说一个区默认有64个页,这128个比特位被划分为64个部分,每个部分2个比特位,对应区中的一个页。这两个比特位的第一个位表示对应的页是否是空闲的,第二个比特位还没有用。

1.3.1 XDES Entry链表

当向某个段中插入数据时

  1. 在刚开始向表中插入数据的时候,段是从某个碎片区以单个页面为单位来分配存储空间的。
    因此,查找FREE_FRAG 有剩余空间的碎片区,申请一些零散的页面将数据插入,直到为FULL_FRAG。否则找FREE空闲的区,插入数据。而为了查找特定状态的区:
  • 把状态为FREE的区对应的XDES Entry结构通过List Node来连接成一个链表,这个链表我们就称之为FREE链表。

  • 把状态为FREE_FRAG的区对应的XDES Entry结构通过List Node来连接成一个链表,这个链表我们就称之为FREE_FRAG链表。

  • 把状态为FULL_FRAG的区对应的XDES Entry结构通过List Node来连接成一个链表,这个链表我们就称之为FULL_FRAG链表。

  1. 当某个段已经占用了32个碎片区页面之后,就会以完整的区为单位来分配存储空间

因为一个段中可以有好多个区,有的区是完全空闲的,有的区还有一些页面可以用,有的区已经没有空闲页面可以用了,为了找出段中特定状态的区:

  • FREE链表:同一个段中,所有页面都是空闲的区对应的XDES Entry结构会被加入到这个链表。注意和直属于表空间的FREE链表区别开了,此处的FREE链表是附属于某个段的。

  • NOT_FULL链表:同一个段中,仍有空闲空间的区对应的XDES Entry结构会被加入到这个链表。

  • FULL链表:同一个段中,已经没有空闲空间的区对应的XDES Entry结构会被加入到这个链表。

1.3.2 链表基节点

上面说到的6种链表,都对应着一个LIst Base Node,因此只要记录下链表基节点,就可以搜索整个链表

image.png

  • List Length表明该链表一共有多少节点,

  • First Node Page Number和First Node Offset表明该链表的头节点在表空间中的位置。

  • Last Node Page Number和Last Node Offset表明该链表的尾节点在表空间中的位置。

2.segment

段由若干个零散的页面以及一些完整的区组成。

2.1 为什么需要引入段的概念?

在进行范围查询的时候,其实我们是对B+树的叶子节点进行扫描,如果将B+树的叶子节点和非叶子节点都放在一个地方的话,就会影响范围查询的速度。

因此,InnoDB将叶子节点的区的集合分为一个段,非叶子区的集合同样也分为一个段。也就是说一个索引会生成2个段,一个叶子节点段,一个非叶子节点段。

但是这也带来了一个问题,就是无论如何一个索引都要至少要占用两个区,就是2M的空间,即使数据量远小于2M,就会造成浪费,因此引入了碎片区的概念。

2.3 碎片区

在一个碎片区中,并不是所有的页都是为了存储同一个段的数据而存在的,而是碎片区中的页可以用于不同的目的,比如有些页用于段A,有些页用于段B,有些页甚至哪个段都不属于。碎片区直属于表空间,并不属于任何一个段。所以此后为某个段分配存储空间的策略是这样的:

  1. 在刚开始向表中插入数据的时候,段是从某个碎片区以单个页面为单位来分配存储空间的。

  2. 当某个段已经占用了32个碎片区页面之后,就会以完整的区为单位来分配存储空间。

2.4 INODE Entry

与区的XDES Entry类似,段也存在INODE Entry,组成如下

image.png

  • Segment ID

就是指这个INODE Entry结构对应的段的编号(ID)。

  • NOT_FULL_N_USED

这个字段指的是在NOT_FULL链表中已经使用了多少个页面。

  • 3个List Base Node

分别为段的FREE链表、NOT_FULL链表、FULL链表定义的List Base Node,这样我们想查找某个段的某个链表的头节点和尾节点的时候,就可以直接到这个部分找到对应链表的List Base Node。

  • Magic Number:

这个值是用来标记这个INODE Entry是否已经被初始化了(初始化的意思就是把各个字段的值都填进去了)。如果这个数字是值的97937874,表明该INODE Entry已经初始化,否则没有被初始化。。

  • Fragment Array Entry

我们前边强调过无数次段是一些零散页面和一些完整的区的集合,每个Fragment Array Entry结构都对应着一个零散的页面,这个结构一共4个字节,表示一个零散页面的页号

3.FSP_HDR(第一组前3个页面之一)

这个页面的类型是FSP_HDR,它存储了表空间的一些整体属性以及第一个组内256个区的对应的XDES Entry结构
image.png

由图可得,这个页面由五部分组成

3.1 File Header

记录页的一些通用信息

3.2 File Space Header

表空间的一些整体属性信息

  • Space ID 4字节 表空间的ID
  • Not Used 4字节 这4个字节未被使用,可以忽略
  • Size 4字节 当前表空间占有的页面数
  • FREE Limit 4字节 尚未被初始化的最小页号,大于或等于这个页号的区对应的XDES Entry结构都没有被加入FREE链表
  • Space Flags 4字节 表空间的一些占用存储空间比较小的属性
  • FRAG_N_USED 4字节 FREE_FRAG链表中已使用的页面数量
  • List Base Node for FREE List 16字节 FREE链表的基节点
  • List Base Node for FREE_FRAG List 16字节 FREE_FRAG链表的基节点
  • List Base Node for FULL_FRAG List 16字节 FULL_FRAG链表的基节点
  • Next Unused Segment ID 8字节 当前表空间中下一个未使用的 Segment ID
  • List Base Node for SEG_INODES_FULL List 16字节 SEG_INODES_FULL链表的基节点
  • List Base Node for SEG_INODES_FREE List 16字节 SEG_INODES_FREE链表的基节点

3.3 XDES Entry

在这部分保存的就是一整个组(256个区)的XDES Entry,

3.4 Empty Space

用于页结构的填充,没啥实际意义

3.5 File Trailer

校验页是否完整

4.INODE(第一组前3个页面之一)

这个INODE类型的页就是为了存储INODE Entry结构而存在的

image.png
结构上与XDES大体相同,但是引入了List Node for INODE Page List

4.1 List Node for INODE Page List

每个INODE Entry结构占用192字节,一个页面里可以存储85个这样的结构。但是一个表空间中可能存在超过85个段,所以可能一个INODE类型的页面不足以存储所有的段对应的INODE Entry结构,所以就需要额外的INODE类型的页面来存储这些结构。于是引入了List Node for INODE Page List:

  • SEG_INODES_FULL链表:该链表中的INODE类型的页面中已经没有空闲空间来存储额外的INODE Entry结构了。

  • SEG_INODES_FREE链表:该链表中的INODE类型的页面中还有空闲空间来存储额外的INODE Entry结构了。

因此插入INODE Entry时

  1. 先看看SEG_INODES_FREE链表是否为空,如果不为空,直接从该链表中获取一个节点,也就相当于获取到一个仍有空闲空间的INODE类型的页面,然后把该INODE Entry结构放到该页面中。当该页面中无剩余空间时,就把该页放到SEG_INODES_FULL链表中。

  2. 如果SEG_INODES_FREE链表为空,则需要从表空间的FREE_FRAG链表中申请一个页面,修改该页面的类型为INODE,把该页面放到SEG_INODES_FREE链表中,与此同时把该INODE Entry结构放入该页面。

5. XDES类型(每组前2个页面之一)

FSP_HDR类型的页面对比,除了少了File Space Header部分之外,也就是除了少了记录表空间整体属性的部分之外,其余的部分是一样一样的。

image.png

6. Segment Header

Page Header部分存在

  • PAGE_BTR_SEG_LEAF 10字节 B+树叶子段的头部信息,仅在B+树的根页定义
  • PAGE_BTR_SEG_TOP 10字节 B+树非叶子段的头部信息,仅在B+树的根页定义
    二者的10字节其实对应Segment Header结构

image.png
PAGE_BTR_SEG_LEAF记录着叶子节点段对应的INODE Entry结构的地址是哪个表空间的哪个页面的哪个偏移量,PAGE_BTR_SEG_TOP记录着非叶子节点段对应的INODE Entry结构的地址是哪个表空间的哪个页面的哪个偏移量。

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

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

相关文章

神经网络推理_分析神经网络推理性能的新工具

神经网络推理Measuring the inference time of a trained deep neural model on different hardware devices is a critical task when making deployment decisions. Should you deploy your inference on 8 Nvidia V100s, on 12 P100s, or perhaps you can use 64 CPU cores?…

Eclipse断点调试

1.1 Eclipse断点调试概述Eclipse的断点调试可以查看程序的执行流程和解决程序中的bug1.2 Eclipse断点调试常用操作:A:什么是断点:就是一个标记,从哪里开始。B:如何设置断点:你想看哪里的程序,你就在那个有效程序的左边双击即可。C…

深入理解InnoDB(7)—系统表空间

系统表空间 可以看到,系统表空间和独立表空间的前三个页面(页号分别为0、1、2,类型分别是FSP_HDR、IBUF_BITMAP、INODE)的类型是一致的,只是页号为3~7的页面是系统表空间特有的 页号3 SYS: Insert Buffer …

CodeForces - 869B The Eternal Immortality

题意&#xff1a;已知a,b&#xff0c;求的最后一位。 分析&#xff1a; 1、若b-a>5&#xff0c;则尾数一定为0&#xff0c;因为连续5个数的尾数要么同时包括一个5和一个偶数&#xff0c;要么包括一个0。 2、若b-a<5&#xff0c;直接暴力求即可。 #include<cstdio>…

如何在24行JavaScript中实现Redux

90% convention, 10% library. 90&#xff05;的惯例&#xff0c;10&#xff05;的图书馆。 Redux is among the most important JavaScript libraries ever created. Inspired by prior art like Flux and Elm, Redux put JavaScript functional programming on the map by i…

卡方检验 原理_什么是卡方检验及其工作原理?

卡方检验 原理As a data science engineer, it’s imperative that the sample data set which you pick from the data is reliable, clean, and well tested for its usability in machine learning model building.作为数据科学工程师&#xff0c;当务之急是从数据中挑选出的…

Web UI 设计(网页设计)命名规范

Web UI 设计命名规范 一.网站设计及基本框架结构: 1. Container“container“ 就是将页面中的所有元素包在一起的部分&#xff0c;这部分还可以命名为: “wrapper“, “wrap“, “page“.2. Header“header” 是网站页面的头部区域&#xff0c;一般来讲&#xff0c;它包含…

27个机器学习图表翻译_使用机器学习的信息图表信息组织

27个机器学习图表翻译Infographics are crucial for presenting information in a more digestible fashion to the audience. With their usage being expanding to many (if not all) professions like journalism, science, and research, advertisements, business, the re…

面向Tableau开发人员的Python简要介绍(第4部分)

用PYTHON探索数据 (EXPLORING DATA WITH PYTHON) Between data blends, joins, and wrestling with the resulting levels of detail in Tableau, managing relationships between data can be tricky.在数据混合&#xff0c;联接以及在Tableau中产生的详细程度之间进行搏斗之间…

蝙蝠侠遥控器pcb_通过蝙蝠侠从Circle到ML:第二部分

蝙蝠侠遥控器pcbView Graph查看图 背景 (Background) Wait! Isn’t the above equation different from what we found last time? Yup, very different but still looks exactly the same or maybe a bit better. Just in case you are wondering what I am talking about, p…

camera驱动框架分析(上)

前言 camera驱动框架涉及到的知识点比较多&#xff0c;特别是camera本身的接口就有很多&#xff0c;有些是直接连接到soc的camif口上的&#xff0c;有些是通过usb接口导出的&#xff0c;如usb camera。我这里主要讨论前者&#xff0c;也就是与soc直连的。我认为凡是涉及到usb的…

探索感染了COVID-19的动物的数据

数据 (The data) With the number of cases steadily rising day by day, COVID-19 has been pretty much in the headlines of every newspaper known to man. Despite the massive amount of attention, a topic that has remained mostly untouched (some exceptions being …

Facebook哭晕在厕所,调查显示用VR体验社交的用户仅为19%

美国娱乐软件协会ESA调查显示&#xff0c;有74%的用户使用VR玩游戏&#xff0c;而仅有19%的用户会用VR进行社交。 当我们说到VR社交&#xff0c;必然离不开Facebook。在刚刚结束的F8大会上&#xff0c;小扎展示了VR社交平台Facebook Spaces测试版&#xff0c;巧的是此前也有好…

解决Javascript疲劳的方法-以及其他所有疲劳

Learn your fundamentals, and never worry again. 了解您的基础知识&#xff0c;再也不用担心。 新工具让我担心 (New Tools Worry Me) When JavaScripts shiny tool of the day comes out, I sometimes overreact. 当JavaScript一天一度的闪亮工具问世时&#xff0c;我有时R…

已知两点坐标拾取怎么操作_已知的操作员学习-第4部分

已知两点坐标拾取怎么操作有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU’s YouTube Lecture “Deep Learning”. This is a full transcript of the lecture video & matching slides. We hope, you enjoy this as mu…

北京供销大数据集团发布SinoBBD Cloud 一体化推动产业云发展

9月5日&#xff0c;第五届全球云计算大会在上海世博展览馆盛大开幕&#xff0c;国内外顶尖企业汇聚一堂&#xff0c;新一代云计算技术产品纷纷亮相。作为国内领先的互联网基础服务提供商&#xff0c;北京供销大数据集团(以下简称“SinoBBD”)受邀参加此次大会&#xff0c;并正式…

“陪护机器人”研报:距离真正“陪护”还差那么一点

一款有“缺陷”的机器人&#xff0c;怎能做到真正的“陪护”&#xff1f; 近日&#xff0c;鼎盛智能发布了一款名为Ibotn的&#xff08;爱蹦&#xff09;幼儿陪伴机器人&#xff0c;核心看点就是通过人脸识别、场景识别等计算机视觉技术来实现机器人对儿童的陪护。不过&#xf…

【转】消息队列应用场景

一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境&#xff0c;…

lime 模型_使用LIME的糖尿病预测模型解释— OneZeroBlog

lime 模型Article outline文章大纲 Introduction 介绍 Data Background 资料背景 Aim of the article 本文的目的 Exploratory analysis 探索性分析 Training a Random Forest Model 训练随机森林模型 Global Importance 全球重要性 Local Importance 当地重要性 介绍 (Introd…

Linux第三周作业

1.三个法宝 ①存储程序计算机工作模型&#xff0c;计算机系统最最基础性的逻辑结构&#xff1b; ②函数调用堆栈&#xff0c;堆栈完成了计算机的基本功能&#xff1a;函数的参数传递机制和局部变量存取 &#xff1b; ③中断&#xff0c;多道程序操作系统的基点&#xff0c;没有…