MySQL磁盘文件结构

1.MySQL磁盘文件结构

1.1.B+Tree结构

最上面的一层的是root层,中间一层的是internal层,这两层统称为non-leaf层,最下面的一层是leaf层。
在这里插入图片描述

1.2.表空间结构

一个table space划分为多个extent,一个extent包含物理上连续64个page,因此一个extent的空间大小为 64*16KB = 1M。一个table space的所有extent按每256个extent进行分组,每个组的第一个extent的前2个或前3个page会记录本组256个extent的相关属性。第一个组前3个page的类型是固定的,即:FSP_HDR、IBUF_BITMAP、INODE。其它组前2个page的类型是固定的,即:XDES、IBUF_BITMAP。虽然FSP_HDR和XDES类型的page作用类似,但是FSP_HDR类型的page比XDES类型的page会额外存储一些table space的属性,整个table space只有⼀个FSP_HDR类型的page。

1.3.索引文件段结构

当执行一条SQL语句,从root page开始查询,root page包含了一个FSEG Header(只有root page该值才不为空),通过FSEG Header的fseg_id找到leaf segment和non-leaf segment,然后通过segment,确定到对应extent以及page上,最终定位到page内的具体的record。
在这里插入图片描述

1.4.innoDB逻辑存储结构

InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(table space)。表空间又由段(segment)、区(extent)、页(page)组成。InnoDB存储引擎的逻辑存储结构大致如图所示。
在这里插入图片描述

1.4.1.表空间(table space)

table space是一个逻辑容器,1个database由1个或多个table space组成,1个table space由1个或多个segment组成,但是1个segment只能属于1个table space。table space从管理上可以划分为系统表空间用户表空间撤销表空间临时表空间等。

1.4.2.段(segment)

为解决extent与extent之间发生随机IO的概率,提出了segment的概念。1个segment是由一些零散page和若干个extent组成。在InnoDB存储引擎的segment中,不要求extent与extent之间必须相邻。当我们创建数据表、索引的时候,就会相应创建对应的segment,1个表最少有2个segment(主键索引的leaf segment和non-leaf segment),同时,每多创建1个索引,就会多2个segment,即leaf segment(所属extent的page都处于B+Tree的leaf位置)和non-leaf segment(所属extent的page都处于B+Tree的non-leaf位置)。为了更好的管理这些段,InnoDB给每个段都创建了一个INODE Entry节点,每个节点占用固定的192个字节。

1.4.3.区(extent)

为解决page与page之间的随机IO问题,提出了extent的概念。extent是比page大一级的存储结构。在InnoDB存储引擎中,要求extent的page与page之间相邻,这样可以让B+Tree的双向链表相邻两个page之间的物理距离尽可能的靠近,从随机IO变成更短的顺序IO。因为InnoDB中1个extent分配64个page,1个page默认大小16KB,所以1个extent的大小是1MB(64*16KB)。当申请的资源不够的时候,不会去申请1个page资源,会一次性从磁盘申请4到5个区,不但提高了page的分配效率,而且使extent中page连续性更优以便数据检索。如果,把主键设置为自增主键,那么,不但保证数据逻辑连续,而且保证了数据物理存储连续。

1.4.4.页(page)

为解决row与row之间的随机IO问题,提出了page的概念。同大多数数据库一样,InnoDB有page的概念(也可以称为块),page是InnoDB磁盘管理的最小单位。
page的特点:

  1. page内部的row数据,按照主键的大小排序。
  2. page与page之间是双向链表连接起来。
  3. 虽然page与page在链表上面紧密的挨着,但是物理地址可能距离很远,可能会发生随机IO(在InnoDB中,为降低这个问题,提出了extent的概念)。
1.4.4.1.页目录(page directory)

B+Tree的page的directory的结构框架如下,page directory用来存储每组records的最后一条record的地址偏移量,这些地址偏移量会按照先后顺序存储到数组中,每组的地址偏移量也被称之为slot(槽),每个slot相当于指针指向了不同records组的最后一个record。通过二分查找算法可以在page directory快速的定位到record所位于的slot(即,record所属的records组)。
在这里插入图片描述

1.4.4.2.非叶子节点页(non-leaf page)

B+Tree的non-leaf page中存储的record可分为system record和user record。其中,system record有两条默认的虚拟record,即下界record(Infimum)和上界record(Supremum);另外,user record(包含:min key、page pointer)根据min key从小到大的顺序依次存储到链表上面。
在这里插入图片描述

1.4.4.3.叶子节点页(leaf page)

B+Tree的leaf page中存储的record可分为system record和user record。其中,system record有两条默认的虚拟record,即下界record(Infimum)和上界record(Supremum);另外,user record(包含:key、value)根据key从小到大的顺序依次存储到链表上面。
在这里插入图片描述

1.5.参考资料

资料1资料2资料3资料4资料5资料6资料7资料8资料9资料10资料11资料12资料13

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值