mysql更新一条语句_MySQL一条更新语句是如何执行的
一條查詢語句是經過連接器 分析器 優化器 執行器等功能模塊,最后到達存儲引擎。
image
以下所說的都基于InnoDb引擎。
當有一條記錄需要更新的時候,InnoDB引擎會先把記錄寫到redo log里面,并更新內存,這個時候更新就算完成了。InnoDb引擎會在適當的時候把記錄更新到硬盤里,往往是在系統比較空閑的時候。
如果內存滿了,就只能先寫到內存里面。
InnoDB的redo log是固定大小的。從頭開始寫,寫到末位又循環回到開頭寫
image
write pos 是當前記錄的位置,一邊寫一邊后移,寫到第 3 號文件末尾后就回到 0 號文件開頭。checkpoint 是當前要擦除的位置,也是往后推移并且循環的,擦除記錄前要把記錄更新到數據文件。
write pos 和 checkpoint 之間的是“粉板”上還空著的部分,可以用來記錄新的操作。如果 write pos 追上 checkpoint,表示“粉板”滿了,這時候不能再執行新的更新,得停下來先擦掉一些記錄,把 checkpoint 推進一下。
有了 redo log,InnoDB 就可以保證即使數據庫發生異常重啟,之前提交的記錄都不會丟失,這個能力稱為crash-safe
binlog
MySQL主要分兩層,Server層和引擎層。Server層的日志成為binlog。
binlog是邏輯日志,記錄了語句的原始邏輯。
binlog是可以追加寫入的,到了一定大小可以換一個文件繼續寫。
update語句的內部流程:
1、執行器先找引擎取ID=2的這一行。ID是主鍵,引擎直接用樹找到這一行。
2、執行器拿到引擎給的行數據,給這個值+1,得到新的一行數據,再調存儲引擎寫入這行新數據。
3、引擎將新數據更新到內存,同時將這個更新記錄記錄到redo log。redolog處于prepare狀態,告知執行器執行完成,可以提交事務
4、執行器生成操作的binlog,寫入磁盤
5、執行器調用引擎的提交事務接口,引擎把redolog改成commit狀態,更新完成。
總結
以上是生活随笔為你收集整理的mysql更新一条语句_MySQL一条更新语句是如何执行的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公共链接url出错_SEO优化技巧:关于
- 下一篇: 人如何认知事物?