更新語句的執行過程

2022-04-12 21:06:19 字數 1980 閱讀 7579

更新語句的流程跟查詢語句大體相同:

1.連線資料庫 ——聯結器的工作

2.在乙個表上有更新的時候,跟這個表有關的查詢快取會失效

3.分析器會通過詞法和語法解析知道這是一條更新語句

4.優化器決定要使用哪個索引(更新也需要先查找到目標行)

5.執行器負責具體執行,找到需要更新的行,然後更新。

與查詢流程不一樣的是,更新流程涉及兩個重要日誌模組:redo log(重做日誌)和binlog(歸檔日誌)。

其中redo log是innodb引擎獨有的,而binlog是server層的日誌,所以所有引擎都可以用。

【個人的記憶方法是認為bin是很多軟體都自帶的,所以對於binlog應該也是比較通用的,另外乙個就是獨特的】

【redo log】

wal(write-ahead logging)技術:關鍵點就是先寫日誌,再寫磁碟。

當有一條記錄需要更新的時候,innodb 引擎就會先把記錄寫到 redo log裡面,並更新記憶體,這個時候更新就算完成了。

同時,innodb引擎會在系統較空閒的時候將操作記錄寫入磁碟。

redo log 是固定大小的,比如可以配置為一組 4 個檔案,每個檔案的大小是 1gb,那麼總共就可以記錄4gb的操作,從頭開始寫,寫到末尾就又回到開頭迴圈寫。

write pos 是當前記錄的位置,一邊寫一邊後移,寫到第3 號檔案末尾後就回到 0 號檔案開頭。

checkpoint 是當前要擦除的位置,也是往後推移並且迴圈的,擦除記錄前要把記錄更新到資料檔案。

write pos 和 checkpoint 之間是還空著的部分,可以用來記錄新的操作。

如果 write pos 追上 checkpoint,表示記錄滿了,這時候不能再執行新的更新,得停下來先擦掉一些記錄,把 checkpoint 推進一下。

crash-safe:保證即使資料庫發生異常重啟,之前提交的記錄都不會丟失

有了 redo log,innodb 就可以做到crash-safe。

為什麼需要兩份日誌?因為單binlog沒有crash-safe功能。所以innodb自己使用另一套——redolog

三點不同:

1.redo log 是 innodb 引擎特有的;binlog是 mysql 的 server 層實現的,所有引擎都可以使用

2.redo log 是物理日誌,記錄的是「在某個資料頁上做了什麼修改」;binlog 是邏輯日誌,記錄的是這個語句的原始邏輯,比如「給 id=2 這一行的 c 欄位加 1 」。(binlog的兩種模式:1.記錄sql語句,2.row:記錄修改前後的資料記錄)

3.redo log 是迴圈寫的,空間固定會用完;binlog是可以追加寫入的

【innodb引擎執行更新語句過程】

圖中淺色框表示是在 innodb 內部執行的,深色框表示是在執行器中執行的

執行器先找引擎取 id=2 這一行。id 是主鍵,引擎直接用樹搜尋找到這一行:如果 id=2 這一行所在的資料頁本來就在記憶體中,就直接返回給執行器;否則,需要先從磁碟讀入記憶體,然後再返回

執行器拿到引擎給的行資料,把這個值加上 1,比如原來是 n,現在就是 n+1,得到新的一行資料,再呼叫引擎介面寫入這行新資料

引擎將這行新資料更新到記憶體中,同時將這個更新操作記錄到 redo log 裡面,此時 redo log 處於 prepare 狀態。然後告知執行器執行完成了,隨時可以提交事務

執行器生成這個操作的 binlog,並把 binlog 寫入磁碟

執行器呼叫引擎的提交事務介面,引擎把剛剛寫入的 redo log 改成提交(commit)狀態,更新完成。

最後三步看上去有點「繞」,將 redo log 的寫入拆成了兩個步驟:prepare 和 commit,就是"兩階段提交"

SQL更新語句執行

分析器 解析知道這是一條更新語句 優化器 決定使用id索引 執行器 具體執行 包括執行 1之類的 redolog crash safe能力,write pos和checkpoint的概念。引擎層innodb,在資料庫讀取的時候不會用redolog合併,會用change buffer中的資料 binl...

一條SQL更新語句的執行過程

目錄如果執行這條更新語句資料庫是如何執行的呢?update student set name 小明 where studentid 1根據之前說過的sql語句查詢的流程來說,只要表上有資料更新,有關查詢的索引就會失效,接下來分析器會根據每個單詞識別知道這是update語句,優化器根據這個id獲取需要...

update 更新語句

update 語句用於修改表中的資料。update 表名稱 set 列名稱 新值 where 列名稱 某值 lastname firstname address city gates bill xuanwumen 10 beijing wilson champs elysees 我們為 lastna...