从理论去分析一张图
前言
很多人都见过下面这张图,或者类似的这张图。如果没有对InnoDB的二进制存储文件有所了解,那么对下图的了解不会很清晰。如果已经有所了解,再来看这张图那么就会略懂。

分析
(1)表空间的第一个extent0的前3个Page很特殊,分别是:FSP_HDR,IBUF_BITMAP和INODE。上图则是从FSP_HDR和INODE两个Page出发。
(2)FSP_HDR的3个链表:FSP_FREE,FSP_FREE_FRAG,FSP_FULL_FRAG 直属于表空间。每个链表都是指向的XDES Entry的头尾指针。XDES Entry通过List Node前后指针形成了双向链表。
FSP_FREE:表示的是空闲的Extent,如果需要申请空间都必须从这里申请。FSP_FREE_FRAG:还存在空闲页的碎片区。表空间中用到的碎片区通过这个链表管理。往往这些碎片区中的Page属于多个Segment。FSP_FULL_FRAG:已用完的碎片区。若FSP_FREE_FRAG的碎片区用完了则移到这个链表。反之如果FSP_FULL_FRAG有了空闲页面则移到FSP_FREE_FRAG。
(3)INode Page的3个链表:FSEG_FREE、FSEG_NOT_FULL、FSEG_FULL。
FSEG_FREE:Fragment用完之后,分配给该段但是还没有用的Extent。FSEG_NOT_FULL:FSEG_FREE中的Page被用了之后,则链接在此。FSEG_FULL:若FSEG_NOT_FULL的Page都被用完,则链接在此。反之如果FSEG_FULL的某个Page被释放,则链接到FSEG_NOT_FULL。如果所有Page被释放也不会到FSEG_FREE,而是交回FSP_FREE。
(4)SEG_INODES_FULL:已被完全用满的Inode page链表。什么情况完全用满了呢?所有的INode Entry都被用了。不过一个索引也就占用2个INode Entry,想要占用完那得42个索引。应该没有这个可能吧?SEG_INODES_FREE:但凡还有一个INode Entry是空闲的,则链接在此。通过这个链表则可以快速找到表空间中所有的INode Entry。通过INode Entry则可以找到Fragment和XDES Entry,进而所有的Page也都可以找到。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: