二.一條SQL更新語句是如何執行的

  1. redo log 怎麼理解?
    答:由於在 MySQL 裏,如果每一次的更新操作都需要寫進磁盤,然後磁盤也要找到對應的那條記錄,然後再更新,整個過程 IO 成本、查找成本都很高。爲了解決這個問題,InnoDB引入了redo log的設計,用的是WAL 技術,WAL 的全稱是 Write-Ahead Logging,它的關鍵點就是先寫日誌,再寫磁盤,先用redo log將數據寫入內存,將本次操作寫入物理日誌(持久化到硬盤),然後再在空閒的時候將數據同步到磁盤中,注意,redo log是將更新的數據直接的先寫入到了內存中,還未持久化到硬盤,這時候持久化的只是本次的物理日誌,記錄的是在某個數據頁上做了什麼修改,若是在數據未持久化到硬盤前系統發生crash的話,是可以通過redo log做到數據的找回的
  2. redo log與bin log的區別
    1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 層實現的,所有引擎都可以使用。
    2. redo log 是物理日誌,記錄的是“在某個數據頁上做了什麼修改”;binlog 是邏輯日誌,記錄的是這個語句的原始邏輯,比如“給 ID=2 這一行的 c 字段加 1 ”
    3. redo log 是循環寫的,空間固定會用完;binlog 是可以追加寫入的。“追加寫”是指 binlog 文件寫到一定大小後會切換到下一個,並不會覆蓋以前的日誌。
  3. 當執行如下sql時,MySQL裏面的流程是怎樣的?
mysql> update T set c=c+1 where ID=2;
答:
1.  執行器先找引擎取 ID=2 這一行。ID 是主鍵,引擎直接用樹搜索找到這一行。如果 ID=2 這一行所在的數據頁本來就在內存中,就直接返回給執行器;否則,需要先從磁盤讀入內存,然後再返回。
2. 執行器拿到引擎給的行數據,把這個值加上 1,比如原來是 N,現在就是 N+1,得到新的一行數據,再調用引擎接口寫入這行新數據。
3. 引擎將這行新數據更新到內存中,同時將這個更新操作記錄到 redo log 裏面,此時 redo log 處於 prepare 狀態。然後告知執行器執行完成了,隨時可以提交事務。
4. 執行器生成這個操作的 binlog,並把 binlog 寫入磁盤。
5. 執行器調用引擎的提交事務接口,引擎把剛剛寫入的 redo log 改成提交(commit)狀態,更新完成。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章