標籤:壓縮 sum ref 分配 load des 第一個 常見 全域
綜述
從上層的角度來看,InnoDB層的檔案,除了redo日誌外,基本上具有相當統一的結構,都是固定block大小,普遍使用的btree結構來管理資料。只是針對不同的block的應用情境會分配不同的頁類型。通常預設情況下,每個block的大小為 UNIV_PAGE_SIZE,在不做任何配置時值為16kb,你還可以選擇在安裝執行個體時指定一個塊的block大小。對於壓縮表,可以在建表時指定block size,但在記憶體中表現的解壓頁依舊為統一的頁大小。
從物理檔案的分類來看,有記錄檔、主系統資料表空間檔案ibdata、undo tablespace檔案、暫存資料表空間檔案、使用者資料表空間。
由於資料庫需要保證資料的完整性,因此在OS系統上封裝了自己的檔案系統。我們來看一張圖,這樣也能更好的理解innodb資料庫的檔案結構
650) this.width=650;" title="innodb vs file system" style="" alt="innodb vs file system" src="http://s3.51cto.com/wyfs02/M02/9E/20/wKioL1mL9U3g9TFiAABaJPL_pJI545.jpg" "366" height="271" />
首先看一下頁(page)的結構
之前有說過,一個資料表空間檔案都是由一個一個16kb的頁組成,每個頁都有一個32位序號(page number),通常稱為位移量,即離資料表空間初始位置的位移量.因為每個頁大小為16kb,所以第0個頁的位移量為0,第一個頁的位移量為16384等等.因為32位的最大值為2^32,所以一個資料表空間的最大值為2^32*16kb=64TB.
650) this.width=650;" title="FIL Header and Trailer" style="" alt="FIL Header and Trailer" src="http://s3.51cto.com/wyfs02/M01/9E/20/wKioL1mL91rxPUl_AACt9eOhboA325.png" "640" height="426" />
- Checksum為校正和,和磁碟打交道的程式為了保證資料正確性,都必須使用校正和,目的是驗證因為磁碟空間損壞導致資料損毀;
- offset(Page Number)為頁的序號,即位移量;
- Previous Page和Next Page InnoDB的資料在記憶體緩衝區是由B+樹組織的,而B+樹中的每一層的頁是由雙向鏈表串起來,因為每個頁header有指向上一個和下一個頁的指標;這種結構可以提升全表掃描的效率;
- LSN for last page modification LSN如果不懂,可以查看InnoDB儲存引擎這本書,簡單說就是用於表示重新整理到重做日誌資料量,可用於重做日誌恢複資料庫.
- Page Type 即頁的類型,頁的類型決定了這個頁其他部分儲存的資料,常見的頁類型有資料業,undo頁,系統頁等等;
- space id 即這個頁屬於的資料表空間
- flush LSN 這個值儲存了重新整理到整個系統任何頁的最大LSN值.
650) this.width=650;" title="type" style="" alt="type" src="http://s3.51cto.com/wyfs02/M02/9E/20/wKioL1mL91uAMEogAAFjtkmqyN4210.jpg" "643" height="351" />
接下來我們來看一下資料表空間(Tablespace)的一些基礎知識
資料表空間是分段管理的,假如有一個表只有一個主鍵索引,那麼這個表就有兩個段,一個是內部節點段,即非葉子節點段,還有一個是葉子段,即儲存資料的節點.如果一個表除了主鍵索引,還有一個輔助索引,那麼這個這個資料表空間有四個段,主鍵內部節點段,主鍵葉子節點段,輔助索引內部節點段,輔助索引葉子節點段.InnoDB儲存引擎有有一張圖很好展示了段,區,頁的關係:
650) this.width=650;" title="tablespace" style="border-image: none; " alt="tablespace" src="http://s3.51cto.com/wyfs02/M01/9E/23/wKiom1mL91yh9sCDAAGPMa5vFHk281.png" "466" height="309" />
當然共用資料表空間ibdata和使用者資料表空間是不一樣的,因為它需要儲存更多全域的一些資訊,例如doublewrite,undo等等,所以共用資料表空間擁有更多的段,這裡先分析使用者資料表空間.
每個資料表空間都有一個唯一space id,因為很多地方都需要使用到這個id,例如記憶體資料刷到磁碟時,需要使用這個space id來尋找資料表空間檔案.InnoDB總有一個"系統空間",即共用資料表空間,這個表系統資料表空間的space id始終為0.
資料表空間結構
一個資料表空間檔案是由一系列的頁組成的,頁數量最多可達2^32個.為了更好管理頁,頁又按1MB(64個連續的頁)分為組,這個組稱為區,InnoDB一般情況下是按區來給段分配空間.
為了管理資料表空間所有頁,區以及資料表空間自己,Innodb必須使用一些資料結構來跟蹤儲存頁區等資訊,展示了一個資料表空間的:
650) this.width=650;" title="Space File Overview" style="" alt="Space File Overview" src="http://s3.51cto.com/wyfs02/M01/9E/20/wKioL1mMAU_xlaK0AADCFxYnRlY215.jpg" "313" height="480" />
每一個資料表空間的第一個頁為FSP_HDR(file space header)頁,這個頁儲存了FSP header結構,這個結構儲存了這個資料表空間的大小,以及完全沒有被使用的extents,fragment的使用方式,以及inode使用方式等等,接下來詳細介紹.
第1個頁只能儲存256個extents,也就是16384個頁,256MB.因此每隔16384個頁必須分配一個新的頁來儲存接下來的16384個頁的資訊,這個頁就是XDES頁,這個XDES頁和第1個頁除了FSP_HDR結構置0外(因為第一個page已經包含了base list,所以後面的XDES page 的FSP_HDR結構置0),其他都一樣.
第二個頁IBUF_BITMAP這個頁就是插入緩衝bitmap頁,用於記錄插入緩衝區的一些資訊.
第三個頁是inode頁,該頁用一個鏈表格儲存體資料表空間中所有段(file segments);之前說段是由若干個extents組成,其實段除了extents之外,還有32個單獨分配的"片段"頁組成,因為有些段可能用不到一個區,所以這裡主要是為了節省空間的.
FSP_HDR PAGE
資料檔案的第一個Page類型為FIL_PAGE_TYPE_FSP_HDR,在建立一個新的資料表空間時進行初始化(fsp_header_init),該page同時用於跟蹤隨後的256個Extent(約256MB檔案大小)的空間管理,所以每隔256MB就要建立一個類似的資料頁,類型為FIL_PAGE_TYPE_XDES ,XDES Page除了檔案頭部外,其他都和FSP_HDR頁具有相同的資料結構,可以稱之為Extent描述頁,每個Extent佔用40個位元組,一個XDES Page最多描述256個Extent。
MySQL · 引擎特性 · InnoDB 檔案系統之檔案物理結構