四、mysql一條sql更新語句的執行過程

目錄

4.1. mysql一條語句更新過程

4.2. 執行過程


4.1. mysql一條語句更新過程

update test1 t set t.id=t.id+1 where id=2;

執行器找引擎拿到id=2的這一行——》執行器拿到數據+1,調用引擎接口寫入這樣數據——》引擎更新到內存、記錄redo log、告知執行器已完成,可隨時提交——》執行器生成binlog日誌,寫入磁盤——》 執行器調用引擎的提交事務接口,引擎把剛剛寫入的 redo log 改成提交(commit)狀態,更新完成

  1. redo log 用於保證 crash-safe 能力。innodb_flush_log_at_trx_commit 這個參數設置成 1 的時候,表示每次事務的 redo log 都直接持久化到磁盤。這個參數我建議你設置成 1,這樣可以保證 MySQL 異常重啓之後數據不丟失。
  2.  sync_binlog 這個參數設置成 1 的時候,表示每次事務的 binlog 都持久化到磁盤。這個參數我也建議你設置成 1,這樣可以保證 MySQL 異常重啓之後 binlog 不丟失。
  3. 在一個表上有更新的時候,跟這個表有關的查詢緩存會失效,所以執行一條update語句就會把表T上所有緩存結果都清空。這也就是我們一般不建議使用查詢緩存的原因。
  4. 接下來分析其會通過詞法和語法解析知道這是一條更新語句。優化器決定要使用ID這個索引。然後,執行器負責具體執行,找到這一行,然後更新。
  5. 與查詢流程不一樣的是,更新流程還涉及兩個重要的日誌模塊:redo log(重做日誌)和binlog(歸檔日誌)。

4.2. 執行過程

執行器和InnoDB引擎在執行一個簡單的update語句時的內部流程:update T set c=c+1 where ID=2;

 

 

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