MySql 學習之 一條更新sql的執行過程

来源:https://www.cnblogs.com/gusluo/archive/2019/08/28/11281687.html
-Advertisement-
Play Games

上一篇文章咱們說了一條查詢sql的執行過程。如果沒有看過上一篇文章的可以去看下上一篇文章,今天咱們說說一條更新sql的執行過程。 上面一條sql是將id為1的分數加上10。 那麼它的執行流程是怎樣的呢?借用上篇文章的圖,如下: 我這邊就再簡單的說一下這個流程,首先客戶端連接mysql伺服器,連接後執 ...


上一篇文章咱們說了一條查詢sql的執行過程。如果沒有看過上一篇文章的可以去看下上一篇文章,今天咱們說說一條更新sql的執行過程。

update scores set  score=c+10 where id=1

上面一條sql是將id為1的分數加上10。

那麼它的執行流程是怎樣的呢?借用上篇文章的圖,如下:

我這邊就再簡單的說一下這個流程,首先客戶端連接mysql伺服器,連接後執行sql語句,執行sql的過程需要經過分析器得出它是需要做update操作,再接著經過優化器它決定使用id這個索引,然後經過執行器通過索引找到這一行,最後進行更新操作。

以上就是整個更新操作得整個流程。說到這你肯定以為說完了,不過很遺憾的告訴你,這才剛剛開始呢。

因為更新操作和查詢操作不一樣,更新操作涉及到兩個非常重要的日誌模塊。redo log (重做日誌) 和 bin log(歸檔日誌)。這個兩個才是今天要說的重點。

首先咱們得知道這兩個日誌是什麼?然後再得知道它們是乾什麼的?

redo log 是 InnoDB 引擎特有,它是屬於物理日誌,主要用於記錄 “某個數據頁上做了什麼修改” ,而且它的記錄空間是固定的並且是會用完的。

bin log 是屬於 server 層持有的,主要是再執行器中記錄日誌,所以mysql所有的引擎都可以使用它。bin log 是屬於邏輯日誌,它有 statement 和 row 兩種模式,statement記錄的是執行的sql語句,row記錄的是更新行的內容,所以是記錄兩條,一條是更新前的內容,另外一條是更新後的內容。預設模式是 row 模式。另外 bin log 是會追加寫入日誌,當日誌文件寫到一定大小的時候,就會切換到下一個繼續寫入日誌,並且不會覆蓋之前的日誌文件。

以上就是這兩種日誌的概念以及作用,那麼現在我們說說它們的記錄流程。咱們先看下麵一張圖,黃填充色的為執行器的操作,藍填充色為InnoDB引擎的操作

 

圖有點長,不過應該很容易看懂。那麼現在就來一步一步的分析。

1、首先執行器會找引擎取id=1這條數據;

2、因為id是主鍵,所以使用樹來找到一行數據。不過引擎先去記憶體中查找是否有這一頁數據;

3、如果有則直接返回數據給執行器;如果沒有就會去磁碟把數據讀入到記憶體中,然後返回數據給執行器。

4、執行器就會執行C+10操作;

5、執行器生成新的一行數據;

6、再調用 InnoDB 引擎的寫入介面,把數據更新到記憶體中;

7、InnoDB 引擎寫入 redo log 日誌,標記狀態為 prepare,並且告訴執行器已經更新數據完成,可以隨時提交事務;

8、執行器把此操作寫入 bin log ,並且把 bin log 寫入磁碟;

9、最後執行器調用引擎的提交事務介面,引擎把 redo log 的狀態改 commit ,至此整個更新操作完成。

 

看到這裡也許你會冒出幾個問題?

1、redo log 空間是固定,那它會不會用完呢?

首先不用擔心 redo log 會用完空間,因為它是迴圈利用的。例如 redo log 日誌配置為一組4個文件,每個文件分別為1G。它寫的流程如下圖:

上圖中有兩塊填充色,黃色和紅色,黃色標記著 check point,這表示這當前擦除掉 redo log 的位置,紅色標記著 write pos ,這表示著當前記錄 redo log 的位置。當 redo log 寫滿了之後,就會停下來,不再寫入數據,會執行擦除 redo log 操作,當然在擦除這些日誌之前,都會把數據寫入到磁碟中,把數據進行持久化。這樣才能保住數據的準確性。

2、為什麼要用這兩種日誌呢?因為在沒有 InnoDB 引擎的時候是沒有 redo log 日誌的。

因為 InnoDB 引擎的 redo log 可以保證即使資料庫突然宕機了或者異常重啟了,之前提交的數據是不會丟失的。這個能力咱們稱之為 crash-safe。

3、當mysql伺服器在執行過程中突然間宕機了,數據會不會丟失?

 答案是不會。為什麼這麼肯定呢?我們可以從第二張圖就可以看出來。比如有以下幾種情況:

1、寫入 redo log 之前宕機了,那麼原始數據是不會發送改變的,因為還沒有進行事務的提交。

2、如果寫入 redo log 之後,寫入 bin log之前宕機,那麼原始數據還是不會變,因為資料庫重啟後,因為兩種日誌的記錄沒有同步,所以不會有新數據生成。

3、在 redo log 生成commit之前宕機了,資料庫重啟後 數據會變成更新後的數據,因為這個時候 redo log 和 bin log 都有了記錄,所以資料庫重啟後會自己進行commit,所以這時候的數據就是更新後的數據了。

我們使用 redo log 主要是需要保證 crash-safe 能力,innodb_flush_log_at_trx_commit這個參數設置成1的時候,表示每次事務的redo log都直接持久化到磁碟。這個參數我建議你設置成1,這樣可以保證MySQL異常重啟之後數據不丟失。

sync_binlog這個參數設置成1的時候,表示每次事務的binlog都持久化到磁碟。這個參數我也建議你設置成1,這樣可以保證MySQL異常重啟之後binlog不丟失。

好了,今天就說到這裡,如果寫的有誤的地方歡迎大家指出,咱們一起討論學習。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用瀏覽器訪問 ip:5601 預設埠,進入首頁 Discover:日誌管理視圖 Visualize:統計視圖 Dashboard:儀錶視圖 Timelion:時間軸視圖 APM:性能管理視圖 DevTools:開發者命令視圖 Monitoring:健康視圖 Management:管理視圖 使用瀏 ...
  • 彙編語言初探 0x00 參考 "阮一峰的網路日誌之彙編語言入門教程" "ARM彙編語言學習筆記(一) ARM彙編的程式結構" 0x01 要點概述 標準化以後,稱為 assembly language,縮寫為 asm,中文譯為彙編語言。 彙編語言是二進位指令的文本形式,與指令是一一對應的關係。 每一種 ...
  • Linux系統啟動流程 從上至下為: BIOS MBR:Boot Code 執行引導程式-GRUB(操作系統) 載入內核 執行init run level 1.BIOS(Basic Input Output System) 基本輸入輸出系統,一般保存在主板上的BIOS的晶元中,負責檢查硬體/查找可啟 ...
  • 開發平臺介紹: NUC970 + 內置CAN控制器(雙通道CAN1\CAN2) + 官方Linux_Kernel(少量修改) 名詞: 終端,使用NUC970的硬體 異常表現: 1、當CAN收發器(VP251)斷電時,此時再恢復CAN外部通訊,終端表現為能收到全部的CAN數據,發送函數返回成功,但CA ...
  • Vi文本編輯器 首先介紹命令模式,命令模式是在進入文本編輯器的時候的當前狀態;輸入模式(插入模式)是在插入文本時候按下的鍵,比如 大小 i 鍵,a鍵、o鍵;底行模式是在命令模式的狀態直接輸入冒號 ":" ,從插入模式到命令模式,按下Esc鍵即可 ①定位游標 命令模式下 向上 k 向下 j 向左 h ...
  • Linux網路配置原理圖(NAT模式) 查看網路IP和網關: CentOS7:ip addr CentOS6:ifconfig Ping測試主機之間網路的連通性:ping [www.baidu.com] 網路環境配置: /etc/sysconfig/network-scripts/ifcfg-eth ...
  • mysql版本分為企業版(Enterprise)和社區版(Community),其中社區辦是通過GPL協議授權的開源軟體,可以免費使用,而企業版是需要收費的商業軟體。 mysql官網 https://www.mysql.com/ ,進去點擊 download 下拉滾動到最後,看到 MySQL Com ...
  • [TOC] 1.介紹 約束條件與數據類型的寬度一樣,都是可選參數 作用:用於保證數據的完整性和一致性 主要分為: 說明: 2.not null 和default 是否可空,null表示空,非字元串 not null 不可空 null 可空 default預設值,創建列時可以指定預設值,當插入數據時如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...