儲存結構
*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判斷)。可以看出頁之間是雙向鍊錶連線(儘管可能並不是物理位置相鄰)並且頁中記錄也是單向鍊錶連線。
innodb儲存引擎表空間儲存結構 讀書筆記
推薦去看 mysql技術內幕 innodb儲存引擎 表空間是innodb儲存引擎邏輯結構的最高層,所有資料都被邏輯地存在表空間中。如果開啟了innodb file per table,則每張表的資料可以單獨放在乙個表空間內,但是這個表空間內只存放資料 索引 插入緩衝bitmap頁。undo資訊 插入...
InnoDB儲存引擎的表的邏輯儲存結構
本文是 mysql技術內幕 innodb儲存引擎 的學習筆記。在innodb儲存引擎中,表都是根據主鍵順序組織存放的,這種儲存方式的表稱為索引組織表 index organized table 索引組織表其實就是儲存在乙個索引結構中的表。innodb對主鍵建立聚簇索引。如果你不指定主鍵,innodb...
innodb邏輯儲存結構
innodb邏輯儲存結構從頂層往下分別是表空間 段 區 頁 行。表空間儲存著所有的資料,是innodb邏輯儲存結構的最高層。預設情況下,innodb只有個共享表空間,所有的資料都儲存在共享表空間中。如果使用者啟動了innodb file per table,則每個表內的資料可以單獨放到乙個表空間內,...