innodb表空間儲存結構

piriineos發表於2018-06-11

儲存結構

*Innodb的邏輯儲存結構如圖所示:

 

其空間管理由段,區和頁構成。段包括葉子節點段,即所有索引的葉子節點都儲存在這個段裡,葉子節點儲存資料(次級索引是主鍵)和鍵值,這可以方便管理並且減少隨機io;還包括非葉子節點,儲存的是指向另外節點的指標和鍵值;回滾段儲存的是每個表的undo日誌(具體分析可看redo&undo日誌解析)。

區的大小固定為1M,不過當一個單獨表空間剛申請時,僅有96kb,只有用完這些空間才會分配一整塊區。

頁預設為16kb,innodb儲存引擎中常見的頁有資料頁,undo頁,系統頁,事務資料頁,bitmap頁等。

行記錄格式一般為兩種,一種compact,包括變長的列長度表,如果該列長度小於255位元組,則該列長度用1位元組表示(剛好最大值255),大於則2位元組(varchar最長65535bytes,實際最多為65532位元組),隨後是null標記位如果該行有null值則置為1,隨後是5位元組記錄頭,其中包含了是否被刪除的標記位,索引堆中排序序號,下一條記錄位置等資訊。是否被刪除主要是用於多版本控制。隨後的即為各種列資料,其中還包含兩個隱藏列:事務ID列用於多版本控制,回滾指標列用於事務。另一種是redundant,跟compact的區別是沒有null標記位,記錄頭為6位元組,多了一個n_fields表明有多少列,一共10位最多1023列。當行記錄溢位時(超過一頁的大小),會把記錄中的長位元組列轉換為blob頁單獨儲存,該記錄中列的位置儲存指向blob頁的指標。

頁的頭部儲存的比較重要的資料有:儲存了checksum,用來校驗頁資料是否正確;LSN,主要用在崩潰恢復時,該頁redo記錄的LSN跟該頁的LSN比較,如果該頁的LSN要大那麼就不對該頁做redo了避免重複恢復;還儲存了前一個頁和後一個頁的指標,實質應該是頁偏移,因為最小單位是頁;儲存了該頁在的頁偏移值;儲存了頁中第一條記錄的指標;以及儲存了一個最小記錄(鍵值比該頁中任何都要小)和一個最大記錄(鍵值比任何一個都大);儲存了最大事務id,在次級索引覆蓋索引查詢時可以迅速判斷整頁是否都可以被看見(read view判斷)。可以看出頁之間是雙向連結串列連線(儘管可能並不是物理位置相鄰)並且頁中記錄也是單向連結串列連線。

相關文章