日志系統(tǒng):一條SQL更新語句是如何執(zhí)行的?
1.update T set c=c+1 where ID=2;的執(zhí)行過程
??建立連接進(jìn)行權(quán)限驗證然后進(jìn)入由于是更新語句就會使該表中的查詢緩存失效,之后分析器進(jìn)行詞法分析以及語法更新,優(yōu)化器進(jìn)行索引的選擇之后直接通過執(zhí)行器進(jìn)行執(zhí)行并調(diào)用存儲引擎的接口最后更新成功。更新的流程涉及到了兩個重要的日志模塊(redo log重做日志,binlog歸檔日志),
2.redo log(重做日志)
??1.在MySQL里存在一個問題,如果每一次的更新操作都需要寫進(jìn)磁盤,然后磁盤也要找到對應(yīng)的那條記錄進(jìn)行更新操作,整個過程的IO成本,查找成本都很高,為了解決這個問題mysql使用WAL(Write-Ahead Logging)技術(shù),它的關(guān)鍵點就是先寫日志,再寫磁盤。
??2.具體的例子是:當(dāng)有一條記錄需要更新的時候,InnoDB引擎就會把記錄寫在redo log中,并更新內(nèi)存,這個時候更新就算完成了,同時InnoDB引擎會在適當(dāng)?shù)臅r候?qū)⒂涗浉碌酱疟P中去,但是一般是在系統(tǒng)比較空閑的時候進(jìn)行的。
??3.InnoDB中的redo log是固定的大小,比如可以配置為一組4個文件,每個文件的大小都是1GB,那么總共可以記錄4GB的操作,具體如下圖所示。
??3.有了redo log之后,InnoDB就可以保證數(shù)據(jù)庫異常重啟之后數(shù)據(jù)不會丟失,這個能力稱之為crash-safe。
參考引用:Mysql實現(xiàn)(極客時間),侵刪!