MySQL InnoDB存儲引擎之表(二)

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

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字節。如下圖:


        其中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數據庫只支持水平分區,並不支持垂直分區。在實際的開發中幾乎都沒有用過,忽略了~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章