1. 程式人生 > >MySQL · 引擎特性 · InnoDB 文件系統之文件物理結構

MySQL · 引擎特性 · InnoDB 文件系統之文件物理結構

src 數量 提升 trail 字節 雙向 mage 指向 展示

綜述

從上層的角度來看,InnoDB層的文件,除了redo日誌外,基本上具有相當統一的結構,都是固定block大小,普遍使用的btree結構來管理數據。只是針對不同的block的應用場景會分配不同的頁類型。通常默認情況下,每個block的大小為 UNIV_PAGE_SIZE,在不做任何配置時值為16kb,你還可以選擇在安裝實例時指定一個塊的block大小。對於壓縮表,可以在建表時指定block size,但在內存中表現的解壓頁依舊為統一的頁大小。

從物理文件的分類來看,有日誌文件、主系統表空間文件ibdata、undo tablespace文件、臨時表空間文件、用戶表空間。

由於數據庫需要保證數據的完整性,因此在OS系統上封裝了自己的文件系統。我們來看一張圖,這樣也能更好的理解innodb數據庫的文件結構

技術分享

首先看一下頁(page)的結構

之前有說過,一個表空間文件都是由一個一個16kb的頁組成,每個頁都有一個32位序號(page number),通常稱為偏移量,即離表空間初始位置的偏移量.因為每個頁大小為16kb,所以第0個頁的偏移量為0,第一個頁的偏移量為16384等等.因為32位的最大值為2^32,所以一個表空間的最大值為2^32*16kb=64TB.

技術分享

  1. Checksum為校驗和,和磁盤打交道的程序為了保證數據正確性,都必須使用校驗和,目的是驗證因為磁盤空間損壞導致數據損壞;
  2. offset(Page Number)為頁的序號,即偏移量;
  3. Previous Page和Next Page InnoDB的數據在內存緩沖區是由B+樹組織的,而B+樹中的每一層的頁是由雙向鏈表串起來,因為每個頁header有指向上一個和下一個頁的指針;這種結構可以提升全表掃描的效率;
  4. LSN for last page modification LSN如果不懂,可以查看InnoDB存儲引擎這本書,簡單說就是用於表示刷新到重做日誌數據量,可用於重做日誌恢復數據庫.
  5. Page Type 即頁的類型,頁的類型決定了這個頁其他部分存儲的數據,常見的頁類型有數據業,undo頁,系統頁等等;
  6. space id 即這個頁屬於的表空間
  7. flush LSN 這個值存儲了刷新到整個系統任何頁的最大LSN值.

技術分享

接下來我們來看一下表空間(Tablespace)的一些基礎知識

表空間是分段管理的,假如有一個表只有一個主鍵索引,那麽這個表就有兩個段,一個是內部節點段,即非葉子節點段,還有一個是葉子段,即存儲數據的節點.如果一個表除了主鍵索引,還有一個輔助索引,那麽這個這個表空間有四個段,主鍵內部節點段,主鍵葉子節點段,輔助索引內部節點段,輔助索引葉子節點段.InnoDB存儲引擎有有一張圖很好展示了段,區,頁的關系:

技術分享

當然共享表空間ibdata和用戶表空間是不一樣的,因為它需要存儲更多全局的一些信息,例如doublewrite,undo等等,所以共享表空間擁有更多的段,這裏先分析用戶表空間.

每個表空間都有一個唯一space id,因為很多地方都需要使用到這個id,例如內存數據刷到磁盤時,需要使用這個space id來尋找表空間文件.InnoDB總有一個"系統空間",即共享表空間,這個表系統表空間的space id始終為0.

表空間結構

一個表空間文件是由一系列的頁組成的,頁數量最多可達2^32個.為了更好管理頁,頁又按1MB(64個連續的頁)分為組,這個組稱為區,InnoDB一般情況下是按區來給段分配空間.

為了管理表空間所有頁,區以及表空間自己,Innodb必須使用一些數據結構來跟蹤保存頁區等信息,下圖展示了一個表空間的示意圖:

技術分享

每一個表空間的第一個頁為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 文件系統之文件物理結構