從理論去分析一張圖

so_easy發表於2020-09-21

前言

很多人都見過下面這張圖,或者類似的這張圖。如果沒有對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 協議》,轉載必須註明作者和本文連結

相關文章