redo log的用處
redo log用途
1. 用途
保證數(shù)據(jù)的更新操作不丟失,同時保證了性能
2. 如何沒有redo log,如何保證數(shù)據(jù)庫的更新操作不會由于數(shù)據(jù)庫的宕機而丟失?
對數(shù)據(jù)庫進行修改,應該是先從磁盤讀取數(shù)據(jù)到內存中,然后在內存中對數(shù)據(jù)進行修改,然后再將數(shù)據(jù)寫入到磁盤中,這樣才能數(shù)據(jù)庫
才能返回數(shù)據(jù)修改成功
按照數(shù)據(jù)庫處理流程來說,首先應該是通過連接器接收到一條SQL語句,然后解析器對這條SQL進行詞法解析,然后由優(yōu)化器生成一個
執(zhí)行計劃,接下來就交由執(zhí)行器來執(zhí)行這個計劃,執(zhí)行器將會調用引擎接口從而實現(xiàn)更新操作
這里就存在一個問題,內存中不存在要修改的數(shù)據(jù)所在的數(shù)據(jù)頁,此時就要將該數(shù)據(jù)頁從磁盤中讀取出來,然后修改完成之后,為了防止
數(shù)據(jù)庫奔潰,就需要將數(shù)據(jù)寫入磁盤中,從這個角度來看,一次數(shù)據(jù)庫的更新操作,就要操作兩次磁盤了
3. 如何使用redo log來保證更新操作的不丟失?
數(shù)據(jù)修改成功之后,就需要將該數(shù)據(jù)頁刷到磁盤中去,以防丟失,但是現(xiàn)在已經引入了redo log,此時只需要這個修改信息寫入到redo log當中,也就是將哪個數(shù)據(jù)頁哪里發(fā)生了修改寫入到redo log當中,而不需要將修改過的整個數(shù)據(jù)頁刷到磁盤當中去
4. 寫redo log同樣也是一次磁盤的寫操作,憑什么說它的性能就更高一點呢?
寫redo log還有刷數(shù)據(jù)頁到磁盤中去,都是磁盤的的寫操作,但是呢,將修改信息寫入到redo log當中,只需要數(shù)據(jù)順序寫入redo log
當中,這里其實就是一次順序寫磁盤的操作.
而將數(shù)據(jù)頁刷到磁盤中,因為一個修改操作可能會同時修改多個數(shù)據(jù)頁,這些數(shù)據(jù)頁又不是連續(xù)的,此時就意味著隨機寫磁盤
并且,對于MySQL來說,一個數(shù)據(jù)頁是16kb,可能一次性更新多個數(shù)據(jù)頁,此時可能需要隨機寫入幾百k的數(shù)據(jù)
而對于redo log,一次修改可能只需要寫入幾k的數(shù)據(jù),數(shù)據(jù)量相對于刷數(shù)據(jù)頁的方式是大大減少的
比較一下寫redo log和刷數(shù)據(jù)頁,寫redo log是磁盤的順序寫,小數(shù)據(jù)量,而刷數(shù)據(jù)頁到磁盤可能就意味著隨機寫,而且還是
大數(shù)據(jù)量的,兩者一比較,寫redo log的性能可能比刷數(shù)據(jù)頁的性能高100倍

浙公網安備 33010602011771號