从理论去分析一张图

前言

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

MySQL

分析

(1)表空间的第一个extent0的前3个Page很特殊,分别是:
FSP_HDRIBUF_BITMAPINODE。上图则是从FSP_HDRINODE两个Page出发。

(2)FSP_HDR的3个链表:FSP_FREEFSP_FREE_FRAGFSP_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_FREEFSEG_NOT_FULLFSEG_FULL

  • FSEG_FREEFragment用完之后,分配给该段但是还没有用的Extent
  • FSEG_NOT_FULLFSEG_FREE中的Page被用了之后,则链接在此。
  • FSEG_FULL:若FSEG_NOT_FULLPage都被用完,则链接在此。反之如果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则可以找到FragmentXDES Entry,进而所有的Page也都可以找到。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!