概覽
邏輯存儲結構
架構
當執行增刪改查操作時,操作的是緩沖區的數據,如果緩沖區里沒有要操作的數據,就會從磁盤中讀取數據加載到緩沖區中;緩沖區的數據會以一定的頻率通過后臺線程刷新到磁盤中永久存儲。
內存結構?
?
磁盤結構
后臺線程
后臺線程的作用就是在合適的時機將內存緩沖池的數據刷新到磁盤文件當中
事務原理
基本概念
redo.log日志
解決事務的持久性
當客戶端執行增刪改操作時,就會去操作緩沖池中的數據(如果此時緩沖池沒有所需要的數據,就會去磁盤文件中加載需要的數據到緩沖池里),然后對相應的數據頁進行更改。緩沖池的某些數據頁被更改后,和磁盤里存儲的數據就不一致了,緩沖池里這些被修改的數據頁就稱為臟頁。在一定的時機里,會通過后臺線程將臟頁的數據刷新到磁盤中進行永久化存儲,但是這個刷新的過程可能會出錯,那么更改的數據就會丟失,但在客戶端提交事務時,就已經在更改緩沖池的數據之后告知客戶端更改完成,這時候就出現了問題。而redo.log就是解決這個問題的。在客戶端進行增刪改時,會對緩沖池中的數據頁進行增刪改操作,在操作之后會將更改過的數據頁即臟頁立即刷新到redo log buffer中,在客戶端提交事務之后,立即將redo log buffer中的臟頁數據刷新到磁盤中的redo.log日志文件中,這樣當后臺線程將緩沖池中的數據刷新到磁盤出錯時,就可以用redo.log中的數據進行數據恢復
為什么每一次提交事務的時候,要把數據刷新到redo log buffer中,而不是直接將buffer pool中的臟頁刷新到磁盤中?這是因為直接將buffer pool中的數據刷新到磁盤中,存在嚴重的性能問題;在執行增刪改操作時,所操作的數據在磁盤中的位置都是隨機的,就涉及到了大量的隨機磁盤IO,性能就比較低。而redo log buffer通過異步IO將數據刷新到磁盤中的redo.log日志文件中,日志文件都是在文件末尾追加數據的,此時就是順序磁盤IO,性能就高于隨機磁盤IO。
如果臟頁中的數據已經順利的刷新到磁盤中的ibd文件里,此時redo.log中的數據就已經沒有用了,因為數據已經存在ibd文件中了,所以每隔一段時間就回去清理redo.log中的數據
undo.log 日志
解決事務的原子性
有兩個作用:一是在事務執行失敗進行回滾時需要用到undo.log,還有一個用于就是MVCC多版本并發控制?
MVCC 多版本并發控制
基本概念
視頻教程:?基本概念
實現原理
記錄中的隱藏字段
undo.log 日志
readview
視頻教程:readview