簡化理解版
想象 InnoDB 是一個高效運轉的倉庫:
-
核心內存區 (大腦 & 高速緩存 - 干活超快的地方)
-
緩沖池?
Buffer Pool
?(最最核心!):-
作用:?相當于倉庫的“高頻貨架”。把最常用的數據(表數據、索引)從慢速的磁盤提前搬到快速的內存里。下次要用直接拿,不用跑遠路去磁盤。
-
好處:?讀寫速度飛起!是 InnoDB 快的關鍵。
-
-
日志緩沖區?
Log Buffer
:-
作用:?一個小型“臨時筆記本”。記錄對數據的修改操作(增刪改)📝,寫滿一本(或定時)就交給“歸檔員”寫到磁盤的大賬本里。
-
好處:?避免頻繁寫慢速磁盤,先攢著一起寫,效率高。
-
-
-
磁盤結構 (倉庫本體 & 賬本 - 持久存儲的地方)
-
表空間?
Tablespaces
?(數據大本營):-
作用:?磁盤上真正存放你表的數據(
.ibd
文件)和索引的大容器。想象成倉庫的貨架和貨位規劃圖。 -
類型:?系統表空間(
ibdata1
,存一些公共信息)、獨立表空間(每個表有自己的.ibd
文件,主流)、臨時表空間等。
-
-
重做日志?
Redo Log
?(救命賬本 -?ib_logfile0
,?ib_logfile1
):-
作用:?一個循環寫的“操作流水賬”。記錄所有修改操作本身(比如“把A記錄字段X從1改成2”)。萬一倉庫突然停電(崩潰),靠這個賬本能精確重做一遍沒來得及存到貨架的操作,保證數據不丟。
-
關鍵點:?順序寫、速度快,是崩潰恢復的核心保障。
-
-
撤銷日志?
Undo Log
?(后悔藥記錄):-
作用:?記錄修改前的舊數據版本📜。用來做兩件事:
-
事務回滾(后悔了,撤銷操作)。
-
實現多版本并發控制
MVCC
(讓不同人看到不同時刻的數據快照,互不干擾)。
-
-
-
-
線程們 (倉庫工人 - 各司其職干活的):
-
主線程?
Master Thread
:?總管,協調其他工人,負責后臺任務(比如定期刷臟頁到磁盤、合并插入緩沖等)。 -
IO線程:?專門負責讀寫磁盤(讀數據頁到緩沖池、寫日志緩沖區到重做日志文件、寫臟頁數據到表空間等)。分讀線程和寫線程。
-
清理線程?
Purge Thread
:?專門回收那些已經沒人需要的舊版本數據(由Undo Log
產生的)。 -
頁面清理線程?
Page Cleaner Thread
:?專門負責把緩沖池里被修改過但還沒寫回磁盤的“臟數據頁”刷回磁盤。
-
最簡化記憶框架:
-
內存干活快:?
緩沖池
(緩存數據) +?日志緩沖區
(攢操作記錄)。 -
磁盤存永久:?
表空間
(存數據文件) +?重做日志
(崩潰恢復賬本) +?撤銷日志
(回滾/MVCC)。 -
線程來協作:?
主線程
(總管) +?IO線程
(搬磁盤) +?清理線程
(收垃圾) +?頁面清理
(刷臟頁)。
關鍵互動流程簡化版:
-
你執行一個
UPDATE
語句。 -
InnoDB 先去
緩沖池
找這條數據在不在內存。-
在:直接改內存里的數據(現在它是“臟頁”了)。
-
不在:先讓
IO線程
從表空間
文件讀到緩沖池
,再改。
-
-
把“改了哪條數據,怎么改的”這個操作記錄寫到
日志緩沖區
。 -
日志緩沖區
滿了(或事務提交時),IO線程
把這一批操作記錄快速順序寫入重做日志redolog
文件(磁盤)。 -
后臺
頁面清理線程
會在合適的時候,把緩沖池
里改過的“臟頁”慢慢寫回表空間
文件(磁盤)。 -
如果改錯了或者事務回滾,
撤銷日志undolog
里記錄了舊值,可以恢復。 -
如果突然斷電,重啟時,InnoDB 會檢查
重做日志
,把那些已經記錄在日志里(說明操作有效)但還沒寫回數據文件的操作重做一遍,保證數據不丟。
一句話總結核心:
InnoDB 靠?緩沖池
?在內存里飛快干活,用?重做日志
?保證數據安全不丟,靠?表空間
?存數據文件,撤銷日志
?支持回滾和多版本讀,各種?線程
?默默協作完成所有后臺任務。
InnoDB引擎邏輯存儲結構
架構
1,內存結構
2,磁盤結構
?
3,后臺線程
將緩沖池中的數據在合適的時間刷新到磁盤中