網上寫MySQL架構的文章比較多,寫InnoDB架構的文章比較少,今天簡單說說InnoDB架構。
畫外音:一分鐘,一幅圖,秒懂。面試
MySQL總體分爲三層:
(1)客戶端,是各類編程語言的connector;
(2)MySQL服務,內部包含各類組件,實現各類功能;
(3)文件系統,數據存儲與日誌;數據庫
其中,MySQL服務內,能夠以插件的形式,實現各類存儲引擎。編程
在InnoDB,MyISAM,Memory…等各類存儲引擎中,InnoDB是使用範圍最廣的。
畫外音:事務,行鎖,彙集索引,MVCC…衆多特性讓InnoDB備受青睞。緩存
InnoDB總體也分爲三層:
(1)內存結構(In-Memory Structure),這一層在MySQL服務進程內;
(2)OS Cache,這一層屬於內核態內存;
(3)磁盤結構(On-Disk Structure),這一層在文件系統上;markdown
這三層的交互有兩類:
(1)經過OS Cache落地數據(上圖中,兩個短箭頭);
(2)直接O_Direct落地數據(長途中,長箭頭);
畫外音:這是一個性能與一致性折衷的設計。架構
InnoDB內存結構包含四大核心組件,分別是:
(1)緩衝池(Buffer Pool);
(2)寫緩衝(Change Buffer);
(3)自適應哈希索引(Adaptive Hash Index);
(4)日誌緩衝(Log Buffer);併發
剛好,這四大核心組件,今年都詳細的寫過。編程語言
目的是提高InnoDB性能,加速讀請求,避免每次數據訪問都進行磁盤IO。
畫外音:和系統架構設計中緩存的功能有點像,避免每次訪問數據庫。
這裏面涉及的技術點包括:預讀,局部性原理,LRU,預讀失敗+緩衝池污染,新生代老生代雙鏈LRU…細節參見《緩衝池(buffer pool),完全懂了!》。ide
目的是提高InnoDB性能,加速寫請求,避免每次寫入都進行磁盤IO。
畫外音:我C,這個牛逼,寫入竟然均可以不進行磁盤IO?
細節參見《寫緩衝(change buffer),完全懂了!》,這篇文章的細節原理,特別有意思。高併發
目的是提高InnoDB性能,加速讀請求,減小索引查詢的尋路路徑。
這裏面涉及的技術點包括:彙集索引,普通索引,哈希索引…細節參見《InnoDB到底支不支持哈希索引》。
目的是提高InnoDB性能,極大優化redo日誌性能,並提供了高併發與強一致性的折衷方案。
這裏面涉及的技術點包括:redo log做用,流程,三層架構,隨機寫優化爲順序寫,次次寫優化爲批量寫…細節參見《事務已提交,數據卻丟了,趕忙檢查下LogBuffer》。
主要包括日誌與表空間,其結構與原理比InnoDB內存結構更加複雜,若是你們感興趣,將來再撰文詳述。
一分鐘系列,但願你們對InnoDB架構,以及InnoDB內存結構的四大組件有了更系統性的瞭解。
知其然,知其因此然,但願你們有收穫。
架構師之路-分享技術思路
《緩衝池(buffer pool),完全懂了!》
《寫緩衝(change buffer),完全懂了!》
《InnoDB到底支不支持哈希索引?》
《事務已提交,數據卻丟了,趕忙檢查下LogBuffer》
末了,昨天有個朋友留言「謝謝」,說面試過程當中,用從「架構師之路」裏學到的知識,完美回答了面試官提出的一個MySQL底層細節問題,順利拿到offer,漲薪20%。後來他和麪試官一對,原來面試官也是看了架構師之路才學會的這個MySQL知識點,才問了相關的問題。
我但願你們從「架構師之路」學到東西,職業生涯往上走,這是個人初衷。若是你們把學到的新知識,拿來出題爲難面試者,這不是我想看到的,這樣對沒有訂閱「架構師之路」的朋友不公平。
我承諾,不把從架構師之路中學到的新知識,做爲面試候選人的面試題!
謝謝你們的支持!