當前位置 主頁 > 行業資訊 >

    update語句,【Mysql】 update語句更新原理

    欄目:行業資訊 時間:2021-03-02 14:03

         update語句的執行流程圖,淺色框表示在InnoDB內部執行的,深色框表示在執行器中執行的。
         1.首先客戶端通過tcp/ip發送一條sql語句到server層的SQL interface。
         2.SQL interface接到該請求后,先對該條語句進行解析,驗證權限是否匹配。
         3.驗證通過以后,分析器會對該語句分析,是否語法有錯誤等。     
         4.接下來是優化器器生成相應的執行計劃,選擇最優的執行計劃。
         5.之后會是執行器根據執行計劃執行這條語句。在這一步會去open table,如果該table上有MDL(metadata lock),則等待。
         如果沒有,則加在該表上加短暫的MDL(S)。
         (如果opend_table太大,表明open_table_cache太小。需要不停的去打開frm文件)。
         6.進入到引擎層,首先會去innodb_buffer_pool里的data dictionary(元數據信息)得到表信息。
         7.通過元數據信息,去lock info里查出是否會有相關的鎖信息,并把這條update語句需要的。
         鎖信息寫入到lock info里(鎖這里還有待補充)。
         8.然后涉及到的老數據通過快照的方式存儲到innodb_buffer_pool里的undo page里,并且記錄undo log修改的redo。
         (如果data page里有就直接載入到undo page里,如果沒有,則需要去磁盤里取出相應page的數據,載入到undo page里)。
         9.在innodb_buffer_pool的data page做update操作。并把操作的物理數據頁修改記錄到redo log buffer里。
         由于update這個事務會涉及到多個頁面的修改,所以redo log buffer里會記錄多條頁面的修改信息。
         因為group commit的原因,這次事務所產生的redo log buffer可能會跟隨其它事務一同flush并且sync到磁盤上。
         10.同時修改的信息,會按照event的格式,記錄到binlog_cache中。(這里注意binlog_cache_size是transaction級別的,不是session級別的參數,一旦commit之后,dump線程會從binlog_cache里把event主動發送給slave的I/O線程)。
         11.之后把這條sql,需要在二級索引上做的修改,寫入到change buffer page,等到下次有其他sql需要讀取該二級索引時,再去與二級索引做merge(隨機I/O變為順序I/O,但是由于現在的磁盤都是SSD,所以對于尋址來說,隨機I/O和順序I/O差距不大)。
         12.此時update語句已經完成,需要commit或者rollback。這里討論commit的情況,并且雙1。
         13.commit操作,由于存儲引擎層與server層之間采用的是內部XA(保證兩個事務的一致性,這里主要保證redo log和binlog的原子性),所以提交分為prepare階段與commit階段。
         14.prepare階段,將事務的xid寫入,將binlog_cache里的進行flush以及sync操作(大事務的話這步非常耗時)。
         15.commit階段,由于之前該事務產生的redo log已經sync到磁盤了。所以這步只是在redo log里標記commit。
         16.當binlog和redo log都已經落盤以后,如果觸發了刷新臟頁的操作,先把該臟頁復制到doublewrite buffer里,把doublewrite buffer里的刷新到共享表空間,然后才是通過page cleaner線程把臟頁寫入到磁盤中。
         原文鏈接:https://blog.csdn.net/w372426096/article/details/88057365
     
英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability 英雄哪里出來:??13萬字《C語言動漫對話教程(入門篇)》??(建議收 大番薯:編程術語英漢對照 風信子的貓Redamancy的快樂星球:PRML - Chapter 02 Probability json_li的博客:jQuery UI Datepicker 選擇時分秒 json_li的博客:wamp You don't have permission to access / on tianjuewudi的博客:強化學習之TRPO tianjuewudi的博客:強化學習之PPO tianjuewudi的博客:強化學習之DQN代碼(pytorch實現) Moqim的博客:學習計劃――《C++程序設計》 Moqim的博客:matlab學習問題與解決方案。 Moqim的博客:單片機學習筆記(1)。 Moqim的博客:單片機學習(2) Moqim的博客:軟考程序員(算法篇) Moqim的博客:單片機學習(3――點亮LED燈) Moqim的博客:單片機學習(4――數碼管顯示) python菜鳥:??【python表白神器】手把手教你用代碼浪漫追求對象 python菜鳥:??matlab深夜刷題,由淺入深(1)?? python菜鳥:??matlab深夜刷題,由淺入深(2)?? python菜鳥:??2021 全國大學生數學建模??完整B 題思路分析 python菜鳥:2021B題國賽數學建模學習(40):三維曲線(非線性 python菜鳥:2021B題國賽數學建模學習(41):單因素方差分析 python菜鳥:Python MySQL入門連接 python菜鳥:Python MySQL創建數據庫 python菜鳥:Python MySQL創建表 python菜鳥:Python MySQL插入表 python菜鳥:Python MySQL選擇 python菜鳥:數學建模學習(42):多元線性回歸,重點! python菜鳥:數學建模學習(43):多項式擬合詳細講解 python菜鳥:Python MySQL查詢在哪里(where) python菜鳥:Python MySQL排序 python菜鳥:Python MySQL刪除 python菜鳥:Python MySQL刪除表 python菜鳥:Python MySQL更新表 python菜鳥:Python MySQL限制 python菜鳥:Python MySQL合并 python菜鳥:?? 萬字Python MySQL從入門到精通詳細教程?? 再也不 python菜鳥:?? C++ 用戶輸入講解教程?? python菜鳥:?? 萬字C++運算符大全講解?? python菜鳥:?? 六千字C++字符串詳細教程?? python菜鳥:??C++數學相關函數詳細教程?? python菜鳥:一個多道批處理系統中僅有 P1 和 P2 兩個作業 寶塔面板開啟數據庫遠程登陸權限 Selenium+Tesseract-OCR智能識別驗證碼爬取網頁數據的實例 Spring使用@Autowired注解實現自動裝配方式 一篇文章帶你用C語言玩轉結構體 @Autowired自動裝配 Jenkins打包微服務構建Docker鏡像運行的實現 網站所固有的特點也沒有發掘 這幾個優點你是否有充分利用? php strstr()是不區分大小寫的嗎? php怎么刪除session_id 一文講解PHP7怎么安裝event擴展 來聊聊FastCgi和PHP-fpm之間有什么瓜葛? 微信公眾平臺被封號絕對不能犯的錯誤操作 決定微信營銷效果的因素是哪些? 一篇文章教你用C語言模擬實現字符串函數 vue+node+socket io實現多人互動并發布上線全流程 C#畢業設計之Winform零壓健身房管理系統 Java數據結構之棧的詳解 C語言代碼詳細描述順序線性表 seo優化通用方式小結 網站推廣3種方法操作流程詳解
A级免费视频