什么是頁?
- 頁是InnoDB中管理數據的最小單元
- 頁與頁之間是通過一個雙向鏈表連接起來。
頁的組成
FileHeader
- 上一頁下一頁的指針
- FIL_PAGE_PREV
- FIL_PAGE_NEXT
PageHeader
Infimum & Supremum Records
會記錄當前頁最大最小記錄
User Records
隨着系統運行,數據產生,User Records 中的數據會不斷的膨脹,相應的 Free Space 空間會慢慢的變小。
- 按照插入順序來排隊的,先到的數據在前面,后來的數據在后面
- User Records 中的行數據之間的單鏈表形成了一個按照 Primary Key排列的順序。
Free Space
Free Space 沒空間了,則說明需要申請新的頁了
Page Directory
MySQL 會在新增數據的時候就將對應的 Slot 創建好,有了 Page Directory ,就可以對一張頁的數據進行粗略的二分查找。至於為什么是粗略,畢竟 Page Directory 中不是完整的數據,二分查找出來的結果只能是個大概的位置,找到了這個大概的位置之后,還需要回到 User Records 中繼續的進行挨個遍歷匹配。
File Trailer
這塊主要是為了防止頁在刷入磁盤的過程中,由於極端的意外情況(網絡問題、火災、自然災害)導致失敗,而造成數據不一致的情況,也就是說形成了臟頁。
一頁能存儲多少數據
頁的默認大小為16kb,假設主鍵 ID 為 bigint 類型,長度為 8 字節,而指針大小在 InnoDB 源碼中設置為 6 字節,這樣一共 14 字節,我們一個頁中能存放多少這樣的單元,其實就代表有多少指針,即 16384/14=1170。所以我們每個非葉子結點最多有1170個子節點。
那么可以算出一棵高度為 2 的 B+ 樹,能存放 117016=18720 條這樣的數據記錄。
根據同樣的原理我們可以算出 一個高度為 3 的 B+ 樹可以存放: 11701170*16=21902400 (2100萬)條這樣的記錄。