InnoDB独立表空间

1. 独立表空间结构

        1.1 区的概念

  为了更好的管理页面,InnoDB提出了区的概念.对于16kb的页,连续的64个页就是一个区.(1 MB) . 无论是系统表空间还是独立表空间,都可以看作是由若干个连续的区组成的,每256个区被划分为一组.

第一组中,extent0这个区最开始的3个页面类型是固定的.

  • FSP_HDR: 这个类型的页面用来登记整个表空间的一些整体属性,以及本组所有的区(0~255)的属性.整个表空间中只会有一个FSP_HDR类型的页面.
  • IBUF_BITMAP: 存储关于Change Buffer的信息.
  • INODE: 存储了许多INODE ENtry的数据结构.

其余各组最开始的2个页面类型是固定的:

  • XDES: 登记本组256个区的属性.
  • IBUF_BITMAP: 存储关于Change Buffer的信息.

  表空间被划分为多个连续的区,每个区默认由64个页面组成,每256个区划分为一组,每个组最开始的几个页面类型是固定的.

        1.2 段的概念

   为对B+树的叶子节点和非叶子节点进行区分.叶子节点和非叶子节点都有自己的区.存放叶子节点的区的集合就是一个段,同样,存放非叶子节点的区的集合也算是一个段. 即一个索引会生成两个段:叶子节点段和非叶子节点段.

   默认情况下,一个使用InnoDB存储引擎的表只有一个聚簇索引,一个索引会生成两个段.而段是以区为单位申请存储空间的,一个区是连续的64个页,占了1MB的空间.  如果只是这种情况,一个只存放了几条记录的表也需要2MB的空间,并且以后每添加一个索引,就需要多申请2MB的空间.

     为避免上述情况造成的空间浪费,InnoDB设计了碎片区的概念. 在一个碎片区中并不是所有的页都是为了存储同一段数据而存在的,碎片区中的页可以用于不同的目的,比如有一些页是段A的,有一些页是段B的. 碎片区直属于表空间,并不属于任何一个段.

  • 在刚开始向表中插入数据时,段是从某个碎片区以单个页面为单位来分配存储空间的.
  • 当某一个页面占满了32个碎片区页面之后,就会以完整的区为单位分配存储空间(原先占用的碎片区页面并不会被复制到新申请的完整的区中).

        1.3 区的分类

InnoDB中的区大致可以分为4类:

  • 空闲的区(FREE) : 现在还没有用到这个区中的任何页面
  • 有剩余空闲页面的碎片区(FREE_FRAG): 表示碎片区中还有可被分配的空闲页面
  • 没有剩余空闲页面的碎片区(FULL_FRAG): 表示碎片区中的所有页面都被分配使用了.
  • 附属于某个段的区(FSEG) : 每个索引都可以分为叶子节点段和非叶子节点段,并且InnoDB会定义一些特殊用途的段.当这些段中的数据量非常大时,将使用区作为基本的分配单位,这些区中的页面完全用于存储该段的数据.

上面说的 XDES Entry结构就是为了方便管理这些区. 每一个区都对应着一个XDES Entry结构,这个结构记录了对应的区的一些属性.

  • Segment ID: 每一个段都有一个唯一的编号 , 用ID表示. Segement ID 字段表示的就是该区所在的段.
  • List Node: 这个部分可以将若干个 XDES Entry 结构串联成一个链表.
  • State: 区的类型
  • Page State Bitmap: 一个区默认是64个页,这128位(16字节) 被划分为64部分,每个部分有两位,对应区中的一个页.这两个位,第一个位表示对应的页是否有空闲,第二位作为一个预留位.

                1.3.2 XDES Entry 链表

 当段中数据较少时,首先会查看表空间中是否有状态为FREE_FRAG的区.如果找到了,那么从该区中取一个零散的页把数据插进去.否则申请一个状态为FREE的区,把该区的状态改为 FREE_FRAG,然后从新申请的区中取一个零散页把数据插进去.

  XDES Entry 中的List Node 会把不同状态的区链接在一起.如: 把状态为FREE的区对应的XDES Entry 结构链接成一个链表.这个链表就被称为 FREE链表.

   但是当段中的数据已经占满了32个零散的页后,就直接申请完整的区来插入数据了.要如何区判断哪些区属于那个段呢?

    InnoDB为每一个段中的区对应的XDES Entry结构建立了3个链表:

  •  FREE链表: 同一个段中,所有页面都是空闲页面的区对应的XDES Entry结构会被加入到这个链表中. 此处的链表是直接附属于某个段的链表.
  •  NOT FULL 链表: 同一个段中,仍有空闲页面的区对应的XDES Entry结构会被加入到这个链表中
  • FULL 链表: 同一个段中,已经没用空闲页面的XDES Entry结构.

List Base Node : 链表基节点 

        这个结构包含了链表的头节点和尾节点的指针以及链表中包含了多少个节点的信息.一般把List Base Node 结构放在表空间中的固定位置.

        1.4 段的结构

  段其实不对应表空间中某一个连续的物理区域,由若干零散的页面以及一些完整的区组成.InnoDB为每一个段提供了INODE Entry结构.

  • Segement ID : 这个INODE Entry 结构对应的段的编号.
  • NOT_FULLN_USED: 在NOT NULL 链表中已经使用了多少个页面.
  • 3个List Base Node: 分别为段的 FREE , NOT_FULL , FULL链表的List Base Node.
  • Magic Number : 用来标记这个INODE Entry 是否已经被初始化了.即把各个字段的值都已经填进去了.
  • Fragment Array Entry[i]: 每一个Fragment Array Entry[i] 结构都对应着一个零散的页面,这个结构一共4字节.表示一个零散页面的页号. 0 <= i <= 31

        1.5 各类型页面的介绍

                1.5.1 FSP_HDR 类型

  第一个组的第一个页面,页号为0.它存储了表空间的一些整体属性以及第一个组内256个区对应的XDES Entry结构.

                1.5.2 XDES 类型

  每一个XDES Entry 结构对应表空间的一个区.在区的数量非常多时,一个单独的页可能无法存放足够多的XDES Entry结构.所以我们把表空间划分为若干组,除了第一个组之外的其它组的第一个页面就是XDES类型,存放本组内所有区对应的XDES Entry结构.

                1.5.3 INODE 类型

   INODE Entry 结构记录了这个段的相关属性.INODE类型的页就是为了存储INODE Entry的.

   

        

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值