程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQLInnoDB存儲引擎之表(二)

MySQLInnoDB存儲引擎之表(二)

編輯:MySQL綜合教程

MySQLInnoDB存儲引擎之表(二)


本篇是繼續上一篇未完的部分繼續說的。

4.InnoDB數據頁結構
頁是InnoDB存儲引擎管理數據庫的最小磁盤單位。頁類型為B-tree Node的頁存放的就是表中行的實際數據。頁由以下七個部分組成:File Header(文件頭)、Page Header(頁頭)、Infimun和Supremum Records、User Records(行記錄)、Free Space(空閒空間)、Page Directory(頁目錄)和File Trailer(文件尾)。 如下圖:

\

其中File Header、Page Header和File Trailer的大小是固定的,分別為38、56、8字節,用來標記該頁的一些信息,如checksum,數據頁所在B+樹索引的層數等。User Records、Free Space和Page Directory這些部分為實際的行記錄存儲空間,因此大小是動態的。下邊分別介紹一下各部分
A.File Header
File Header用來記錄一些頁的頭信息,由8個部分組成,共占用38字節。如下圖:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141204/2014120409175432.jpg" alt="\">

其中FIL_PAGE_TYPE的具體類型如下圖:

\

B.Page Header
Page Header用來記錄數據頁的一些狀態信息,由14個部分組成,共占用56字節。如下圖:

\

C.Infimun和Supremum
在InnoDB存儲引擎中,每個數據頁都有兩個虛擬的行記錄,用來限定記錄的邊界。Infimun記錄是比該頁中任何主鍵都要小的值,Supremum指比任何可能大的值還要大。都是在頁創建時被建立,並且在任何情況下都不會被刪除。在Compact和Redundant行格式下,占用的字節數不想同。如下圖:


D.User Record和Free Space
User Record就是實際存儲行記錄的內容。Free Space指空閒空間,同樣也是一個鏈表數據結構,在一條數據被刪除後,該空間會加入到空閒鏈表中。
E.Page Directory
Page Directory中存放了記錄的相對位置(是頁相對位置而不是偏移量),有些時候這些記錄指針稱為Slots(槽)或者Directory Slots(目錄槽)。在InnoDB存儲引擎的槽是一個稀疏目錄(spare directory),即一個槽中可能包含多個記錄。偽記錄Infimum的n_owned值總是1,記錄Supremum的n_owned的取值范圍為[1,8],其他用戶記錄n_owned的取值范圍[4,8]。當記錄被插入或者刪除時需要對槽進行分裂或平衡的維護操作。在Slots中記錄是按照索引鍵值進行存放的,這個樣子可以利用二叉查找迅速找到記錄的指針。由於InnoDB存儲引擎中Page Directory是稀疏目錄,二叉查找的結果是一個粗略的結果,因此InnoDB存儲引擎必須通過record header中的next_record來繼續查找相關記錄。B+樹索引本身並不能找到具體的一條記錄,能找到只是該記錄所在的頁。數據庫把頁載入到內存中,然後通過Page Directory在進行二叉查找。二叉查找的時間復雜度很低,同時在內存中的查找很快,因此通常忽略這部分查找所用的時間。
F.File Trailer
為了檢查頁是否已經完整的寫入磁盤(如可能發生的寫入過程中磁盤損壞、機器關機等),InnoDB存儲引擎的頁設置了File Trailer部分。File Trailer只有一個FIL_PAGE_END_LSN部分,占用8字節。前4字節代表該頁的checksum值,最後4字節和File Header中的FIL_PAGE_LSN相同。將這兩個值與File Header中的FIL_PAGE_SPACE_OR_CHECKSUM和FIL_PAGE_LSN值進行比較,看是否一致(checksum的比較需要通過InnoDB的checksum函數來進行比較,不是簡單的等值比較),以此來保證頁的完整性。
在默認配置下,InnoDB存儲引擎每次從磁盤讀取一個頁就會檢測該頁的完整性,即頁是否發生Corrupt。用戶可以通過參數innodb_checksums來開啟或者關閉這個頁完整性的檢查。MySQL 5.6.6版本開始新增參數innodb_checksum_algorithm來設置checksum函數的算法。默認為crc32,可以設置的值有:innodb、crc32、none、strict_innodb、strict_crc32、strict_none.
5.Named File Formats機制
隨著InnoDB存儲引擎的發展,新的頁數據結構有時用來支撐新的功能特性。如InnoDB 1.0.X版本提供了新的頁數據結構來支持表壓縮功能,完全的溢出(Off page)大變長字符類型字段的存儲。這些新的頁數據結構和之前版本的頁並不兼容,因此InnoDB存儲引擎通過Named File Formats機制來解決不同版本之間的兼容性。通過參數innodb_file_format設置文件格式。通過參數innodb_file_format_check來檢測當前InnoDB存儲引擎文件格式的支持度,默認為ON。
6.視圖
視圖(view)是一個命名的虛表,由一個SQL查詢來定義,可以當做表使用,與持久表不同的是,視圖中的數據沒有實際的物理存儲。在實際的開發中幾乎都沒有用過,忽略了~~
7.分區表
分區的過程是將一個表或者索引分解為多個更小、更可管理的部分。目前MySQL數據庫只支持水平分區,並不支持垂直分區。在實際的開發中幾乎都沒有用過,忽略了~~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved