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