Mysql學習(五)InnoDB架構分析

InnoDB的內存結構

在這裏插入圖片描述

Buffer Pool緩衝池

數據頁和索引頁

Page是InnoDB存儲的最基本結構,也是InnoDB磁盤管理的最小單位,與數據庫相關的所有內容都存在Page結構中。Page分爲多種類型其中數據頁與索引頁是最關鍵的兩種類型。

插入緩衝(Insert Buffer)

對於InnoDB插入時由於B+Tree的特性,按照主鍵順序插入時效率是最高的。但當一張表存在非唯一非聚簇索引時,數據頁還是順序存放,但是葉子節點就需要離散的訪問非聚簇頁了,這樣會造成插入效率下降。
爲了解決這一問題,MySql設計了插入緩衝,對於非聚簇索引的插入,並不是立即插入到索引中,而是先判斷插入的索引是否在緩衝池中,若存在直接插入,若不存在先放入緩衝池,然後再以一定得頻率將緩衝池中的信息與索引葉子節點合併,這樣可以將多個插入操作合併到一個操作中,大大提升了對非聚簇索引的插入性能。

自適應哈希索引(Adaptive Hash Index)

InnoDB會根據訪問頻率和模式,對熱點頁建立哈希索引,來提高檢索效率,InnoDB會監控對錶上各個索引頁的查詢,如果發現建立哈希索引會帶來檢索效率的提升,則建立哈希索引,所以叫自適應哈希索引。
建立自適應哈希索引有一個要求就是對一個頁的連續訪問模式必須是一樣的,也就是說查詢條件(where)必須一致,且必須是連續的。

鎖信息(Lock Info)

存放所有的鎖信息。

數據字典信息(Data Dictionary)

存放的是表結構,數據庫名,表名,字段的數據類型,索引、視圖字段信息,存儲過程,觸發器等信息。

Rodo Log Buffer 重做日誌緩衝

當緩衝池中的頁的版本比磁盤要新時(稱作髒頁,並不是髒數據的意思,只是這個版本比磁盤要新),數據庫需要將新版本的頁從緩衝池刷新到磁盤中稱作數據落盤。
但是如果每一次變化就進行刷新,那麼性能開銷是非常大的,於是InnoDB採用了Write Ahead Log(WAL)策略,即當事務提交時,先寫重做日誌,然後再擇時(check point檢查點)將髒頁寫入磁盤。如果發生宕機導致數據丟失,就通過重做日誌進行恢復(這也不能保證萬無一失,也有可能數據還沒有寫入重做日誌中,但是寫入重做日誌的頻率肯定遠遠大於髒頁落盤的頻率)
在這裏插入圖片描述
同樣InnoDB爲了提高日誌寫入的效率,重做日誌信息會先存放在重做日誌緩衝當中,然後再按照一定得頻率刷新到日誌文件中(日誌落盤)。重做日誌緩衝不用設定的非常大,因爲一般來說每一秒都會進行一次日誌落盤。參數innodb_log_buffer_size來控制重做日誌緩衝大小,默認8MB。
注意:日誌文件是順序寫入,數據落盤是隨機寫,所以日誌落盤效率大於日誌落盤

innodb_flush_log_at_trx_commit是InnoDB調優的一個基礎參數,定義了日誌落盤的策略。
0:事務提交時不進行寫入日誌操作,。
1:數據提交時必須進行一次fsync(操作系統命令,fsync函數同步內存中所有已修改的文件數據到儲存設備。即進行了數據落盤)。
2:表示提交時之寫入OS BUFFER但不進行fsync操作。
這三個機制裏面

  1. 0寫入效率最高,但是由於提交時並沒有理解寫入磁盤,這樣喪失了事務的持久性,所以數據安全最差。
  2. 1寫入效率最低,但是數據安全最好。也只有1才能保證事務的持久性。
  3. 寫入效率 與數據安全都是中等水平。
    一般建議設成1。
    在這裏插入圖片描述

Double Write 雙寫

在這裏插入圖片描述
雙寫由兩部分組成,一部分是內存中2MB的雙寫緩衝,一部分是磁盤中連續128頁加起來大小同樣爲2MB。在對緩衝池髒頁進行刷新時並不是直接寫入磁盤而是通過memcpy函數將藏也先複製到內存中的double write buffer,在分兩次每次1MB順序寫入共享表空間物理磁盤上,然後沒,馬上通過fsync函數同步磁盤,避免操作系統緩衝寫帶來的問題。在完成double write頁的寫入後,再將double write buffer的頁吸入哥哥表空間文件中。
如果操作系統在將頁吸入磁盤的過程中發生了崩潰,在回覆過程中,InnoDB存儲引擎可以從共享表空間double write頁找到該頁的副本將其複製到表空間文件中,再應用重做日誌。

Innodb的磁盤文件

在這裏插入圖片描述
innodb磁盤文件分爲

  1. 系統表空間
  2. 用戶表空間
  3. .frm表元數據文件

系統表空間(ibdata文件)

所有的表共享的表空間存放下面的內容

  1. 數據字典:存放數據庫相關信息,也就是 InnoDB 表的元數據
  2. double write buffer: 雙寫緩存,防止頁鍛鍊,解決部分寫失敗
  3. insert buffer :內存insert buffer數據,週期性寫入表空間,防止意外宕機
  4. 回滾段
  5. undo空間

在這裏插入圖片描述

用戶表空間

所有的表的元數據默認存放在系統表空間中,當my.ini中配置innodb_file_per_table = 1時,表的數據和索引的文件會存放在一個單獨的文件中
在這裏插入圖片描述
該文件主要存放下列信息

  1. 表的數據和索引
  2. 表的結構
  3. undo空間

.frm文件

保存了每個表的元數據,包括表結構的定義等;

重做日誌

在這裏插入圖片描述
redo日誌,在mysql中默認以ib_logfile0,ib_logfile1名稱存在,可以手工修改參數,調節開啓幾組日誌來服務於當前mysql數據庫,mysql採用順序,循環寫方式,每開啓一個事務時,會把一些相關信息記錄事務日誌中(記錄對數據文件數據修改的物理位置或叫做偏移量);
這個系列文件個數由參數innodb_log_files_in_group控制,若設置爲4,則命名爲ib_logfile0~3。
這些文件的寫入是順序、循環寫的,logfile0寫完從logfile1繼續,logfile3寫完則logfile0繼續。

redo log只是記錄所有innodb表數據的變化。
redo log只是記錄正在執行中的dml以及ddl語句。
redo log可以作爲異常down機或者介質故障後的數據恢復使用
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章