MySQL InnoDB儲存引擎之表(二),mysqlinnodb

來源:互聯網
上載者:User

MySQL InnoDB儲存引擎之表(二),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位元組。如:


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

相關文章

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.