innodb是怎样逐步插入一条数据的(四)

开课吧开课吧锤锤2021-03-05 10:23

    Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

    整体结构

    以上是表空间中不同对象各自的结构和数据信息,下面从整体的角度看一看各个组件是如何关联的。

Java

    微观上,表空间文件从物理上分隔为大小相等且连续的页。

    宏观上,表空间文件从物理上分隔为大水相乘且连续的区/簇。

    0号文件的0号页称为FSP页,即首页,可以假定为表空间的封面页。它存储了整个表空间其它组件的链表指针,是整个表空间的入口页。

    从逻辑上,FSP页通过两条线指向不同组件。

    (1):通过FSP_SEG_INODES_FULL(已写满的段页链表)和FSP_SEG_INODES_FREE(未写满的段页链表),指向段信息。段实体又通过FSEG_FREE(空闲的区/簇链表)、FSEG_FULL(写满的区/簇)、FSEG_NOT_FULL(未写满的区/簇),指向属于本段的区/簇。

    (2):通过FSP_FREE(空闲的区/簇链表)、FSP_FREE_FRAG(未写满的碎片区/簇)、FSP_FULL_FRAG(已写满的碎片区/簇),指向不属于任何段的区/簇。

    每256个区/簇的第一个区/簇的第一页存储这256个区/簇的管理信息。0号页因为特殊叫做FSP页,其它叫做XDES页。通过这个页号以及存储在其中的Entry位置偏移量,可以很容易的计算出这256个区在磁盘上的位置。因此即使XDESEntry中没有记录区/簇的编号或地址,也可以知道每个Entry管理的是哪个区/簇。

    当index页中插入一条数据时,如果本页已满,则需要向此页所在的区/簇申请空间,如果此区/簇也满了,则向所在的段申请,如果段也满了,则会向表空间申请,表空间会通过操作系统向磁盘申请3个区/簇,并加入到FSP中的FSP_FREE链表中。然后再一级级分配,存储到其对应的链表中。

    行/Row

    以上介绍的所有对象都是为了给业务数据分配一块用来存储的物理空间,到此终于可以在指定的页中记录业务数据。而innodb是基于行进行存储,下面简单的看一看行Compact格式的存储结构。

Java

    每条记录都包含一系列头信息,描述当前记录的存储状态如图。但是除了头信息外,则根据记录所在节点不同存储的数据也有所不同。

    聚集索叶子节点,记录存储的是表中的业务行,除行数据本身外,还包含了事务id,回滚段指针,以及在没有指定主键和唯一索引时还包含一个隐藏的row_id。

    非叶子节点针对的是B+树搜索,因此记录的是子节点的最小记录值以及子节点的页号。

    以上内容由开课吧老师敖丙提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享