从理论去分析一张图
前言
很多人都见过下面这张图,或者类似的这张图。如果没有对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 协议》,转载必须注明作者和本文链接
推荐文章: