mysql中具體的數據是存儲在行中的,而行是存儲在頁中的。也就是說頁是凌駕於行之上的。
mysq一個頁大小為16K,當然這個大小是可以通過修改配置文件來改變的。
mysql頁結構大致示意圖:
當我們新建一個表的時候表中用戶記錄部分(user records)部分是空的,在我們插入一條記錄后會被記錄到其中,直到插入滿時會把記錄信息刷入到下一個頁中,循環往復。。。
記錄頭信息大致示意圖:
1.delete_mask:表示該行記錄是否被刪除其實就是刪除記錄的標識位並占用一個二進制位,其中0--未刪除 1--已刪除
2.heap_no:表示當前記錄在該頁中的位置,除此之外heap_no中還存在兩條虛擬記錄行用於記錄當前頁中最大記錄和最小記錄的主鍵值
3.next_record:表示當前記錄的真實數據到下一條記錄的真實數據的地址偏移量,其實這就是個單項鏈表,可以通過一條記錄找到下一條記錄。但值得注意的是下一條記錄並不是我們插入順序的下一條記錄而是按照主鍵值由小到大的順序的下一條記錄。而且規定最小記錄的下一條記錄就是本頁中存儲的主鍵值最小的記錄,而本頁中主鍵值最大的記錄的下一條記錄就是本頁中的最大記錄
如圖所示:
上圖所示的記錄的順序是順序插入的記錄順序(1.2.3.4),可是我們在實際開發中經常會出現非順序插入的情況。如下圖所示:
當出現非順序插入的情況,雖然插入順序由(1.2.3.4)變為了(1.2.4.3)但是它的鏈表順序是不會改變的依舊保持(1.2.3.4)這里需要注意的是圖中heap_no的順序插入和heap_no的非順序插入是不一樣的。
當我們在實際開發過程中出現表記錄刪除的情況時上圖中的相應記錄信息也會發生變化例如:最大記錄行和最小記錄行的變化(可能會變化)、next_record的變化(參照數據結構中單鏈表刪除時的變化,后繼指針置空操作)、delete_mask的變化(0--未刪除 1--已刪除)、heap_no的變化、n_owned值的變化
注意:不論我們怎么做增刪改操作,InnoDB對頁中的數據始終會維護一個單向鏈表,鏈表中各個節點是按照主鍵值由小到大的順序來存儲的