mysql 二 update語句執行過程

2022-01-29 13:58:05 字數 1100 閱讀 7408

上篇文章 學習了 mysql的基礎架構,理清了一條查詢sql在mysql中的執行過程,其實update語句的執行過程也是大致相同的。

以下面的一條sql為例 (id為主鍵)

update t set b=b+1 where id = 2
客戶端通過聯結器與mysql建立連線 

刪除要update表的快取

分析器解析sql並判斷是否含有語句錯誤

優化器確定查詢索引

執行器呼叫innodb儲存引擎介面獲取id=2的資料行。

innodb儲存引擎掃瞄主鍵索引查詢到id=2的行返回給server層。

執行器將b+1 呼叫儲存引擎介面寫入該行資料。

innodb儲存引擎將資料儲存在記憶體中(wal)。

innodb儲存引擎寫redo日誌,prepare狀態,通知server層。

server層 提交binlog後通知innodb儲存引擎。

innodb儲存引擎將redo日誌commit。

至此一條update語句就執行完成了。

redo日誌:innodb儲存引擎特有的機制,可以用來應對異常恢復,crash-safe,redo可以保證mysql異常重啟時,將未提交的事務回滾,已提交的事務安全落庫。

二階段提交:redo(perpare)--->binlog-->redo(commit) 保證了mysql在異常重啟的時候,資料的一致性,在任意環節出錯,都可以保證redo日誌和binlog的一致性。

wal:第8個步驟,innodb沒有直接將資料落盤,而是存在記憶體中,並記錄日誌,這裡用到的技術就是wal(write-ahead logging)。資料在持久化硬碟前,如果mysql異常重啟,innodb可以根據redo日誌將未持久化的資料恢復。redo日誌是有大小限制的,迴圈寫,當redo快要寫滿時,將redo日誌頭部的記錄清理,擦除記錄前要把記憶體記錄更新到資料檔案。

binlog: binlog 記錄的是邏輯日誌,是mysql的歸檔日誌,支援所有引擎使用。與redo不同的是,binlog是不限制大小,檔案追加寫。

這裡將老師的圖貼上(對應的5--11的步驟)

MySql批量更新語句(UPDATE)

下面建立乙個名為 bhl tes 的資料庫,並建立名為 test user 的表,字段分別為 id age name create database ifnot exists bhl test 檢視結果 檢視結果 張三 18 男 趙四 17 女 劉五 16 男 周七 19 女 檢視結果 張三 whe...

SQL語句 UPDATE語句

update students set sname abcd gender 1 where sid 1 update students,students2 set students.sname students2.sname,students.gender students2.gender wher...

mysql查詢計畫語句 mysql語句及執行計畫

mysql uroot p mysql h10.0.0.100 uuser password show databases insert into user select id 3333504 user name password birthday mobile email province cit...