網上寫MySQL架構的文章比較多,寫InnoDB架構的文章比較少,今天簡單說說InnoDB架構。
畫外音:一分鐘,一幅圖,秒懂。
MySQL簡要架構是怎麼樣的?

MySQL整體分為三層:
(1)用戶端,是各種程式設計語言的connector;
(2)MySQL服務,内部包含各種元件,實作各種功能;
(3)檔案系統,資料存儲與日志;
其中,MySQL服務内,可以以插件的形式,實作各種存儲引擎。
在InnoDB,MyISAM,Memory…等各種存儲引擎中,InnoDB是使用範圍最廣的。
畫外音:事務,行鎖,聚集索引,MVCC…衆多特性讓InnoDB備受青睐。
InnoDB簡要架構是怎麼樣的?
InnoDB整體也分為三層:
(1)記憶體結構(In-Memory Structure),這一層在MySQL服務程序内;
(2)OS Cache,這一層屬于核心态記憶體;
(3)磁盤結構(On-Disk Structure),這一層在檔案系統上;
這三層的互動有兩類:
(1)通過OS Cache落地資料(上圖中,兩個短箭頭);
(2)直接O_Direct落地資料(長途中,長箭頭);
畫外音:這是一個性能與一緻性折衷的設計。
InnoDB記憶體結構包含哪些核心元件?
InnoDB記憶體結構包含四大核心元件,分别是:
(1)緩沖池(Buffer Pool);
(2)寫緩沖(Change Buffer);
(3)自适應哈希索引(Adaptive Hash Index);
(4)日志緩沖(Log Buffer);
恰好,這四大核心元件,今年都詳細的寫過。
緩沖池(Buffer Pool)
目的是提升InnoDB性能,加速讀請求,避免每次資料通路都進行磁盤IO。
畫外音:和系統架構設計中緩存的功能有點像,避免每次通路資料庫。
這裡面涉及的技術點包括:預讀,局部性原理,LRU,預讀失敗+緩沖池污染,新生代老生代雙鍊LRU…細節參見《緩沖池(buffer pool),徹底懂了!》。
寫緩沖(Change Buffer)
目的是提升InnoDB性能,加速寫請求,避免每次寫入都進行磁盤IO。
畫外音:我C,這個牛逼,寫入居然都可以不進行磁盤IO?
細節參見《寫緩沖(change buffer),徹底懂了!》,這篇文章的細節原理,特别有意思。
自适應哈希索引(Adaptive Hash Index)
目的是提升InnoDB性能,加速讀請求,減少索引查詢的尋路路徑。
這裡面涉及的技術點包括:聚集索引,普通索引,哈希索引…細節參見《InnoDB到底支不支援哈希索引》。
日志緩沖(Log Buffer)
目的是提升InnoDB性能,極大優化redo日志性能,并提供了高并發與強一緻性的折衷方案。
這裡面涉及的技術點包括:redo log作用,流程,三層架構,随機寫優化為順序寫,次次寫優化為批量寫…細節參見《事務已送出,資料卻丢了,趕緊檢查下LogBuffer》。
InnoDB磁盤結構包含哪些核心元件?
主要包括日志與表空間,其結構與原理比InnoDB記憶體結構更加複雜,如果大家感興趣,未來再撰文詳述。
一分鐘系列,希望大家對InnoDB架構,以及InnoDB記憶體結構的四大元件有了更系統性的了解。
知其然,知其是以然,希望大家有收獲。
本文轉自“架構師之路”公衆号,58沈劍提供。