InnoDB體系架構

NO IMAGE

前言

上篇說到了MySQL總共分為4層,分別是網絡連接層,核心層,存儲引擎層和物理層。大家已經瞭解了MySQL數據庫的體系,那該篇就寫明存儲引擎層InnoDB的體系結構。

概述

InnoDB的整體架構包括多個內存組成的緩衝池和多個後臺線程

緩存池緩存硬盤數據(解決CPU速度和磁盤速度嚴重不匹配問題),後臺進程保證緩存池和硬盤數據一致性,並保證數據異常宕機時能恢復到正常狀態。

緩存池包括三個部分:redo log buffer,innodb_buffer_pool,innodb_additional_mem_pool。

  • redo log buffer:緩存重做日誌。
  • innodb_buffer_pool:緩存數據,索引信息。
  • innodb_additional_mem_pool:緩存LRU鏈表等。

後臺線程包括master thread,IO thread,purge thread,page cleaner thread。

  • master thread:負責刷新緩存數據到硬盤上。
  • IO thread:處理insert buffer,重做日誌,讀寫請求等回調。
  • purge thread:回收undo頁。
  • page cleaner thread:刷新髒頁。

InnoDB體系架構

InnoDB內部協調管理

一條SQL進入MySQL服務器,會依次經過連接池模塊(進行鑑權,生成線程),查詢緩存模塊(是否被緩存過),SQL接口模塊(簡單的語法校驗),查詢解析模塊,優化器模塊(生成語法樹),然後在進入InnoDB存儲引擎模塊。至此,剛才的過程上篇都寫過了,所以這邊就一筆帶過。

進入InnoDB後,首先會判斷該SQL涉及到的頁是否存在於緩存中,注意MySQL是每次從硬盤中加載相應的頁到內存中,進行相關操作的。如果不存在,則加載數據到緩存中。

其次,如果是select語句,則讀取相關語句,並將查詢結果返回值服務器。如果是update,insert,delete語句,則讀取相關的頁面,先試圖給該SQL涉及的記錄枷鎖。

接著,加鎖成功後,先寫undo頁,邏輯記錄這些記錄修改前的狀態,然後在修改相關記錄,這些操作會同步到redo log buffer,繼而生成重新日誌。

最後,修改完成,將髒數據刷新到硬盤上。

InnoDB體系架構

相關文章

不要為了“分庫分表”而“分庫分表”

詳解B+樹及其正確打開方式

扒一扒InnoDB數據在硬盤上是如何存放的

探究MySQL各類文件