MySQL 基礎知識梳理學習(二)----記錄在頁面層級的組織管理
1.InnoDB的數據存儲結構
InnoDB中數據是通過段、簇、頁面構成的。
(1)段是表空間文件中的主要組織結構,它是一個邏輯概念,用來管理物理文件,是構成索引、表、回滾段的基本元素。創建一個索引(B+樹)時會同時創建兩個段,分別是內節點段和葉子段,內節點段用來管理(存儲)B+樹中非葉子節點(頁面)的數據,葉子節點用來管理(存儲)B+樹中葉子節點數據。一個索引包括2個段,那麽一個表的段的數目,就是索引的個數乘以2了。
(2)簇是構成段的基本元素,一個段有若幹個簇構成。一個簇是物理上連續分配的一段空間,每個段至少有一個簇,在創建一個段時就會默認創建一個簇。如果存儲數據時,一個簇已經不足以放下更多的數據,此時需要從這個段中分配一個新的簇來存放新的數據。一個段所管理的空間大小是無限的,可以一直擴展下去,但擴展的最小單位是簇。簇的空間大小是固定的,一般為64個頁面。
一個索引是由兩個段組成的,兩個段之間的物理位置是沒有關系的,而每個段由多個簇組成,多個簇之間的物理位置也是沒有關系的。
(3)簇的物理空間內部還可以繼續被切分並高效管理。“頁面”就是簇在細化之後的產物,它是簇的組成單位,也是段所管理的最小單位、數據庫文件管理的最小單位,也是文件中空間分配的最小單位。一個頁面默認為16KB。一個簇中可以包含多個頁面(默認64)個頁面,這個頁面數通常被稱為“簇的大小”。這些頁面都歸這個簇管理,在邏輯上(頁面號都是從小到到連續的)以及物理上都是連續的。
2.頁面是如何對記錄組織管理的
InnoDB是使用B+樹來保證通過樹形結構找到一個記錄所在的頁面,而在頁面內部真正找到這條記錄是通過“槽”
槽位於頁面的最後位置,其長度與頁面內存儲的記錄數有關。
槽中數據的增長是以高字節到低字節的順序存儲的,最高位的槽代表的是頁面內索引順序最小的記錄,而低槽位代表的是索引順序最大的記錄,即在頁面內,通過槽位置的順序,來表示業內所有記錄的順序。
可以將槽理解為是一個以下標值為元素值的可自由擴展的數組。並且,這個數組是有序的,在不斷增刪改的過程中,都會修改這個數組,該平移的平移,該刪除的刪除,但需要保證的是,每次操作完成之後,槽的數組還是有序的。當然,真實的數組元素值不會是下標,從上面的示意圖可以看出,真正的值是頁面內槽所對應的記錄在頁面內的偏移量。所以,如果,頁面內數據發生了改變,只需要修改槽的位置即可變相地修改頁面內數據的大小關系了。
我們知道,在每條記錄開始位置之前的兩個字節,是用來存儲下一條記錄的指針信息的,所以在每一個槽指向的最後一條記錄前面,為了體現它會指向下一個槽的第一條記錄,都會有一個指向說明框,用來說明指向的值是多少、位置是多少。
從示意圖中可以看出,槽中存儲的數據是沒有順序的,因為它們是槽所對應的第一個記錄在頁面內的偏移量,比如第0號位存儲的989,這說明本頁內最小的記錄在偏移為989的位置存儲,這個槽對應的數據還可以查詢到2、3、4,他們是通過鏈表連接起來的。值為4的記錄是第0號槽的最後一條記錄,值為4的記錄指向的下一個記錄為偏移為289位置值為6,這個位置正好是第1位的槽,第1號槽包括的數據有6、9、11、11、15這四個值。依次類推,可以從槽數據出發,找到頁面內所有記錄,並且數據都是有序的,可以利用二分查找的方法快速搜索定位找到所需的記錄。
最後補充說明一點,頁面最後的8個字節,主要存儲的頁面校驗的CHECKSUM值(前四節)和當前頁面最新被修改的LSN值(後四節)。
-----主要部分內容參考梳理於網絡知識,此僅為學習筆記,在此原創作者感謝!
MySQL 基礎知識梳理學習(二)----記錄在頁面層級的組織管理