MySQL · 引擎特性 · InnoDB 檔案系統之檔案物理結構

來源:互聯網
上載者:User

標籤:壓縮   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" />

  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值.

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 檔案系統之檔案物理結構

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.