专栏首页做不甩锅的后端Page management in InnoDB space files(4.InnoDB Space文件的页管理)

Page management in InnoDB space files(4.InnoDB Space文件的页管理)

在前面《学习InnoDB核心之旅》中,我介绍了innodb_diagrams项目来记录InnoDB的内部。它提供了这篇文章中用到的所有图表。 每个页面的基本结构和空间描述是InnoDB空间文件布局的基本知识,现在我们将进一步描述InnoDB的结构与管理页面和区段。以及自由空间管理,以及它如何追踪页分配给许多不同的用途,以及使用哪个页。

区段和区段描述符

如前所述,InnoDB的页面通常为16KB,通常由64个连续的page构成一个1MB的块。这被称为一个区段。InnoDB在空间中的固定分配FSP_HDR和XDES页面,以跟踪哪些区段正在使用,以及每个区段中的哪些页面正在使用,这些页面有一个相当简单的结构:

他们包含通常的FIL页眉和页脚,以及一个FSP标头,和256个范围描述符。他们还包含大量未使用的空间。 范围描述符的结构如下:

范围描述符中各个字段的目的是:

  • File segment ID:范围所述的文件段ID,如果它属于一个文件段。
  • List node for XDES list:指向双向链表区段描述符中的上一个和下一个区段的指针。
  • State:域的当前状态,目前只定义了四个值,FREE、FREE_FRAG、FULL_FRAG,这意味着该区域属于同名的空间列表。以及FSEG,表示此区段属于文件段,其ID存储在文件段的ID字段中。
  • Page State Bitmap:区段中每页2位的位图,64*2=128位,或者16字节。第一位表示页面是否空闲,第二位是保留的,用于指示页面是否干净,没有未刷新的数据。但是这个位目前没有被使用,并且总是设置位1。 引用区段的其他结构使用的区段描述符所在的FSP_HDR或者XDES页的页码和描述符条目本身在该页的字节offset的组合来引用区段。如:page 0 offset 150 引用的区段就是空间中的第一个区段。占页0-63.而page 16384 offset 270 占用页16576-16639。

列表的基本节点和其节点

列表(或者InnoDB中所谓的空闲列表)是一种相当通用的结构,它允许将多个相关的结构链接在一起。它由两个互补的结构构成。形成一个很有特色的磁盘上的双链表。列表基本节点的结构如下:

基本节点只在一些高级结构中存储一次,比如FSP头。它包含列的长度,以及指向列表中的第一个和最后一个列表节点的指针。实际上和列表节点看起来非常相似。

当然,列表节点不存储抵押给和最后一个指针,而是存储前一个和后一个指针。 所有的指针都是由一个页码(需要在一个相同的space之内)和在可以找到列表节点的页面内的字节offset组成。所有指针都指向链表节点的开始即N+0,而不一定指向链接在一起的结构。例如,当描述符条目列表中的链接,因为列表节点在offset为8的XDES结构。代码阅读这个列表必须直到描述符结构开始前的8个字节的offset,从这读这个结构。确保list节点在任何结构中始终排在首位可能是个好主意,但是事实上并非如此。

文件空间的头和区段列表

除了存储区段描述符条目本身之外,FSP_HDR页面在一个空间中始终都是0,还存储FSP头文件,其中包含许多列表,因此在前面不容易描述,FSP头的结构如下:

FSP头文件中的相关字段的解释如下:

  • Space ID :空间ID。
  • Highest page number in the space (size):size是最大的有效页码,并且随着文件的增长而增加。但是,并不是所有这些页面都初始化了,有些可能是0填充。因为扩展空间是要给多步骤的过程。
  • Highest page number initialized (free limit):自由限制的FIL头已经初始化的最高页码,它将页码存储在页本身以及其他的内容中,自由限制总是小于或者等于其大小。
  • Flags:存储与空间相关的标识符。
  • Next Unused Segment ID:将用于下一个分配的文件段的文件ID。这本周上是一个自动递增的整数。
  • Number of pages used in the FREE_FRAG list:这是作为一种优化存储,以便能够快速计算FREE_FRAG列表中的空闲页面的数量,而无需遍历列表中的所有区段并对每个区段的可用的空闲页面进行求和。 以下区段描述符列表的列表基本节点也存储在FSP头中:
  • FREE_FRAG: 有申宇空闲页面区段被分配给段中使用,将个别页分配给不同的目的,而不是分配整个区段。丽日,每个带有FSP_HDR或者XDES页的区段将被放在FREE_FRAG列表中,以便区段中的剩余空闲页可以分配给其他的用途。
  • FULL_FRAG:与FREE_FRAG类似,但是对于没有剩余空闲页面的区段,当区段已满的时候,区段将从FREE_FRAG移动到FULl_FRAG,当页面被释放的时候,区段将移回FREE_FRAG,这时候区段就不再满了。
  • FREE:完全未使用 并且可以全部分配给某些用途的区段,可以将空闲的区段分配给文件段,开放在适当的INODE列表中。或者移动到FREE_FRAG列表以供单独的页使用。

文件段和索引节点

文件段和索引节点可能是InnoDB术语和文档中最为模糊的地方。InnoDB重载了文件系统中常用的术语inode。并将其用于inode条目(单个)。和inode页面。(包含多个inode条目的页面类型)暂且不考虑命名上的混乱,InnoDB中的Inode条目仅仅描述一个文件段,通常称为FSEG,从现在起将被称为文件段INODE,包含他们的INODE页面将有如下结构:

每个INODE页面包含85个文件段INODE条目,在16KB的page上,每个都是192字节。他们还包含一个列表节点,用于上述FSP_HDR和FSP头结构中的以下INODE页面列表:

  • FREE_INODES:具有至少一个空闲的文件段INODE条目的INODE页面列表。
  • FULL_INODES:一列没有空闲文件段INODE条目的INODE页面。当使用每个表文件的空间的时候,每个表空间中的这个列表将是空的,除非表超过42个索引,因为每个索引只消耗两个文件段INODE项。 文件段INODE结构如下:

每个字段的含义如下:

  • File Segment ID: 这个文件段INODE条目列表描述的文件段FSEG的ID。如果ID为0,则该条目没使用。
  • Magic Number:值97937874存储为该文件段INODE条目已正确初始化的标记。
  • Number of used pages in the NOT_FULL list: 与SPACE的FREE_FRAG列表在FSP头文件中完全一样,该字段存储NOT_FULL列表中使用的页面数量,作为一种优化,以便能够快速计算列表中空闲的页面数量,而无须遍历列表中的所有区段。
  • 片段数组:一个包含32个页号的页面数组,这些页面分别从空间的片段区段的FREE_FRAG或者FULL_FRAG列表中的区段分配,一旦该数组已满,就只能将完整的区段分配给文件段。

随着表的增长,他将在每个文件段中分配各个页面,直到片段数组满了为止,然后切换到每次分配1个区段,最终每次分配4个区段。 列出范围描述符的基本节点也出现在每个文件段的INODE条目中:

  • FREE :完全未使用并分配给文件段的区段。
  • NOT_FULL: 至少有一个以使用页面分配给此文件段的区段。当使用最后一个空闲页的是偶,区段将移动到完整列表。
  • FULL:没有分配给此文件段的空闲页的区段,如果页面变为空闲,则将区段移动到NOT_FULL列表。 如果最后使用的页从NOT_FULL列表中的区段释放,则区段可以移动到文件段空闲的列表,但是实际上是直接移动回空闲列表。

索引如何使用文件段

虽然还没有对索引页进行描述,但是现在可以从一个小的方面入手,每个索引的FSEG头的根页面包含指向文件段INODE条目的指针,这些条目描述了索引所使用的文件段。每个索引使用一个文件段用于page,一个用于非page(内部),这个信息存储在FSEG的header结构中:

当且的空间id有些多余,他们将始终与当前的空间相同,索引节点的页中指向文件段索引节点的条目的页码和offset,这两个文件段将始终存在,即使他们可能完全为空。 例如,在一个新创建的表中,唯一存在的是页面的根页面,他也是要给叶子页面,但是存在于内部的文件段中,以便它不必再以后被移动,叶文件段的INODE列表和片段数组将全部为空,内部文件段INODE列表将全部为空,单个根页面将位于片段数组中。

全盘说明

下面的图将说明索引的整个多级结构:

索引的根页面指向两个索引节点(文件段),每个节点都有一个片段数组,(从一个片段列表中指向最多32个单独的页面),以及几个完整的区段列表,这些区段通过区段描述符中的列表指针链接在一起。区段描述符既可用于引用区段,也用于耿总区段内的空闲页面。

接下来介绍什么

接下来,我们将从用户的角度来看最重要的页面类型之一,索引页面的结构,然后我们将看到innoDB是如何在高层次上构造的索引。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • InnoDB with reduced page sizes wastes up to 6% of disk space(15.InnoDB减少页的大小会造成6%的磁盘空间浪费)

    InnoDB数据存储的研究中,我提到了MySQL的Bug #67963,题目是“InnoDB每16384页中浪费62页”。我说: InnoDB偶尔需要分配一些...

    冬天里的懒猫
  • The physical structure of InnoDB index pages(6.InnoDB索引页文件的物理结构)

    《学习InnoDB:核心之旅》中,我介绍了innodb_diagrams项目来记录InnoDB的内部,它提供了这篇文章中用到的图表。(请注意,下面的每张图片都链...

    冬天里的懒猫
  • InnoDB Tidbit:The doublewrite buffer wastes 32 pages (512 KiB) (12.双写缓冲区会导致512KB的浪费)

    在我不断探索完全理解InnoDB数据存储的过程中,我遇到了一个非常小而无关紧要的问题。这个问题还是比较有趣的。我注意到下面的页面的块,他们很早就在ibdata1...

    冬天里的懒猫
  • InnoDB:表空间管理

    在InnoDB中,用户定义的表及其对应的索引数据存储在扩展名为.ibd的文件中。表空间有两种类型,常规(或共享)表空间和独立表空间文件。对于共享表空间而言,来自...

    MySQLSE
  • LeetCode 661. 图片平滑器

    包含整数的二维矩阵 M 表示一个图片的灰度。 你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) , 平均灰度的计算是周围的8个单元和它本身...

    Michael阿明
  • 利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)

    WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素。若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了。

    周小董
  • 2020年云计算10大预测

    云计算已经进入了一个成熟阶段,其特点是标准化和更强的跨平台兼容性。那么,云计算在未来一年里会有什么发展呢?尽管该行业的发展速度可能快得令人发狂,但宏观的趋势和过...

    SDNLAB
  • 2020年云计算10大预测

    云计算已经进入了一个成熟阶段,其特点是标准化和更强的跨平台兼容性。那么,云计算在未来一年里会有什么发展呢?尽管该行业的发展速度可能快得令人发狂,但宏观的趋势和过...

    CloudBest
  • [Go] golang获取http中的get传递的参数

    此处备注一下 , 通过Request实例中获取URL , 然后调用URL的方法就可以了

    陶士涵
  • 平安区块链白皮书:区块链推动建立开放与共享的新金融体系

    点滴科技资讯

扫码关注云+社区

领取腾讯云代金券