本篇是繼續上1篇未完的部份繼續說的。
4.InnoDB數據頁結構
頁是InnoDB存儲引擎管理數據庫的最小磁盤單位。頁類型為B-tree Node的頁寄存的就是表中行的實際數據。頁由以下7個部份組成:File Header(文件頭)、Page Header(頁頭)、Infimun和Supremum Records、User Records(行記錄)、Free Space(空閑空間)、Page Directory(頁目錄)和File Trailer(文件尾)。 以下圖:
其中File Header、Page Header和File Trailer的大小是固定的,分別為38、56、8字節,用來標記該頁的1些信息,如checksum,數據頁所在B+樹索引的層數等。User Records、Free Space和Page Directory這些部份為實際的行記錄存儲空間,因此大小是動態的。下邊分別介紹1下各部份
A.File Header
File Header用來記錄1些頁的頭信息,由8個部份組成,共占用38字節。以下圖:
其中FIL_PAGE_TYPE的具體類型以下圖:
B.Page Header
Page Header用來記錄數據頁的1些狀態信息,由14個部份組成,共占用56字節。以下圖:
C.Infimun和Supremum
在InnoDB存儲引擎中,每一個數據頁都有兩個虛擬的行記錄,用來限定記錄的邊界。Infimun記錄是比該頁中任何主鍵都要小的值,Supremum指比任何可能大的值還要大。都是在頁創建時被建立,并且在任何情況下都不會被刪除。在Compact和Redundant行格式下,占用的字節數不想同。以下圖:
D.User Record和Free Space
User Record就是實際存儲行記錄的內容。Free Space指空閑空間,一樣也是1個鏈表數據結構,在1條數據被刪除后,該空間會加入到空閑鏈表中。
E.Page Directory
Page Directory中寄存了記錄的相對位置(是頁相對位置而不是偏移量),有些時候這些記錄指針稱為Slots(槽)或Directory Slots(目錄槽)。在InnoDB存儲引擎的槽是1個稀疏目錄(spare directory),即1個槽中可能包括多個記錄。偽記錄Infimum的n_owned值總是1,記錄Supremum的n_owned的取值范圍為[1,8],其他用戶記錄n_owned的取值范圍[4,8]。當記錄被插入或刪除時需要對槽進行分裂或平衡的保護操作。在Slots中記錄是依照索引鍵值進行寄存的,這個模樣可以利用2叉查找迅速找到記錄的指針。由于InnoDB存儲引擎中Page
Directory是稀疏目錄,2叉查找的結果是1個粗略的結果,因此InnoDB存儲引擎必須通過record header中的next_record來繼續查找相干記錄。B+樹索引本身其實不能找到具體的1條記錄,能找到只是該記錄所在的頁。數據庫把頁載入到內存中,然后通過Page Directory在進行2叉查找。2叉查找的時間復雜度很低,同時在內存中的查找很快,因此通常疏忽這部份查找所用的時間。
F.File Trailer
為了檢查頁是不是已完全的寫入磁盤(如可能產生的寫入進程中磁盤破壞、機器關機等),InnoDB存儲引擎的頁設置了File Trailer部份。File Trailer只有1個FIL_PAGE_END_LSN部份,占用8字節。前4字節代表該頁的checksum值,最后4字節和File Header中的FIL_PAGE_LSN相同。將這兩個值與File Header中的FIL_PAGE_SPACE_OR_CHECKSUM和FIL_PAGE_LSN值進行比較,看是不是1致(checksum的比較需要通過InnoDB的checksum函數來進行比較,不是簡單的等值比較),以此來保證頁的完全性。
在默許配置下,InnoDB存儲引擎每次從磁盤讀取1個頁就會檢測該頁的完全性,即頁是不是產生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)是1個命名的虛表,由1個SQL查詢來定義,可以當作表使用,與持久表不同的是,視圖中的數據沒有實際的物理存儲。在實際的開發中幾近都沒有用過,疏忽了~~
7.分區表
分區的進程是將1個表或索引分解為多個更小、更可管理的部份。目前MySQL數據庫只支持水平分區,其實不支持垂直分區。在實際的開發中幾近都沒有用過,疏忽了~~