mysql整體架構和語句的執行流程

来源:https://www.cnblogs.com/yingxiaozhu/archive/2022/06/25/16411644.html
-Advertisement-
Play Games

mysql服務端整體架構 主要分為兩部分,server層和存儲引擎 server層包括連接器、查詢緩存、分析器、優化器、執行器等,涵蓋mysql的大多數核心服務過功能,以及所有的內置函數,所有跨存儲引擎的功能都在這一層實現,比如存儲過程,觸發器,視圖等 存儲引擎層負責數據等存儲和讀取,其架構模式是插 ...


mysql服務端整體架構

主要分為兩部分,server層存儲引擎

  • server層包括連接器查詢緩存分析器優化器執行器等,涵蓋mysql的大多數核心服務過功能,以及所有的內置函數,所有跨存儲引擎的功能都在這一層實現,比如存儲過程,觸發器,視圖等
  • 存儲引擎層負責數據等存儲和讀取,其架構模式是插件式的,支持InnoDBMyISAM等多個引擎。從mysql5.5.5版本開始InnoDB成為了預設引擎。

MySql查詢流程

由mysql客戶端發起請求,連接器負責與客戶端連接驗證許可權,連接成功之後開始查詢緩存(當緩存開啟時),如果命中則直接返回數據,如果沒有命中則交由分析器進行sql詞法和語法分析,然後交給優化器進行選擇索引生成執行計劃,最後交給執行器去調用存儲引擎的API獲取結果並返回

查詢緩存

當 MySQL 服務端拿到一條 SQL 查詢語句後,首先會查詢緩存,看之前是不是執行過這條語句。如果執行過,會緩存在記憶體中,這個時候直接返回之前緩存的查詢結果給客戶端即可;如果在緩存中沒有找到對應的記錄,就會繼續後面的操作,並且在最終執行完成後,將查詢結果保存到查詢緩存。

註:MySQL 8.0 版本開始將不再支持查詢緩存功能。

可以通過show variables like '%query_cache%';語句查看系統查詢緩存的設置

query_cache_typeOFF 表示預設關閉。你可以在配置文件中配置該值來決定是否啟用查詢緩存。

分析器

如果查詢緩存沒有啟用或者沒有命中,就開始真正執行 SQL 查詢語句了。

MySQL 會通過分析器對 SQL 語句做詞法分析,以確定到底要做什麼,比如 select 表示查詢語句,update 表示更新語句等,表名是什麼,查詢的欄位有哪些,查詢的條件是什麼。

優化器

如果 SQL 語句詞法和語法分析都沒有問題,接下來,會經由優化器生成執行計劃,這裡面主要的工作是數據表包含索引的時候,判定是否使用索引,以及使用哪些索引效率最高(掃描行數最少),我們可以在執行一個 SQL 查詢語句之前通過 explain 語句查看它的執行計劃:

執行器

根據執行計劃執行sql查詢語句時,會先驗證許可權,有相應許可權才會繼續執行,否則會報許可權錯誤

具體的查詢操作是通過存儲引擎提供的API介面完成的。執行器調用這些介面可以完成諸如讀取下一行記錄、插入記錄、更新記錄之類的日常資料庫操作,執行 SQL 查詢返回所有滿足條件的結果集也是如此。

SQL更新語句執行流程與日誌寫入

和sql查詢語句一樣,MySql客戶端提交SQL更新語句前,先要通過連接器建立連接,連接器驗證許可權等相關操作,然後交給分析器進行詞法和語法分析後由執行器負責具體的執行。(修改、刪除語句也是一樣)

當一張數據表有更新的時候,對應的查詢緩存數據就會被清空。

與查詢流程不一樣的是,更新還涉及到日誌的寫入,redo log(重做日誌)和binlog(歸檔日誌)

日誌寫入

MySql的設計者引入了WAL技術(Write-Ahead Logging),即先寫日誌,在寫磁碟。

比如InnoDB引擎,當有記錄需要更新的時候,InnoDB就會先把記錄寫到redolog裡邊,並更新記憶體,這時候更新操作就算是完成,等InnoDB空閑的時候,在將這個操作更新到磁碟裡邊。這樣做就是因為如果每次更新操作都要寫到磁碟的話,整個IO成本會非常高。

redo log

redo Log 是InnoDB引擎提供的日誌系統,bindlog可以一直追加寫入,負責資料庫全量數據的備份和恢復,資料庫集群的主從同步也是基於binlog實現的。

binlog

binlog是屬於MySql Server層面的,所有存儲引擎都可以共用它

在 InnoDB 引擎出現之前,MySQL 預設的存儲引擎是 MyISAM,那個時候為了實現數據備份和恢復,使用的是 binlog,不過 binlog 是一個歸檔日誌,不具備資料庫崩潰重啟後的數據恢復功能

兩個日誌的寫入流程

  1. 執行器通過 API 介面將更新數據傳遞給存儲引擎執行更新操作;
  2. 存儲引擎在拿到更新數據後,先將其更新到記憶體,同時將這個更新操作記錄到 redo log,此時 redo log 處於 prepare 狀態,然後告知執行器執行完成了,隨時可以提交事務;
  3. 執行器生成這個操作的 binlog,並把 binlog 寫入磁碟(寫入時機可以配置,對於事務操作而言,都是在事務提交時才會持久化寫入的,相關細節我們後面講資料庫數據一致性的時候會詳細介紹);
  4. 執行器調用引擎的提交事務介面,引擎把剛剛寫入的 redo log 改成 commit 狀態,更新完成。

在上述步驟中,將 redo log 的寫入拆成了兩個步驟:preparecommit,這就是「兩階段提交」。

如果不使用兩階段提交,會導致兩份日誌恢復的數據不一致:比如先寫 redo log,binlog 還沒有寫入,資料庫崩潰重啟;或者先寫 binlog,redo 還沒有寫入資料庫崩潰重啟,都將造成恢複數據的不一致。

而使用兩階段提交後,就可以保證兩份日誌恢復的數據一致:只有 binlog 寫入成功的情況下,才會提交 redo log,否則 redo log 處於 prepare 狀態,事務會回滾,這樣一來,就保證了數據的一致性。

本文來自博客園,作者:穎小主,轉載請註明原文鏈接:https://www.cnblogs.com/yingxiaozhu/p/16411644.html


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

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是首屏載入 首屏時間(First Contentful Paint),指的是瀏覽器從響應用戶輸入網址地址,到首屏內容渲染完成的時間,此時整個網頁不一定要全部渲染完成,但需要展示當前視窗需要的內容,首屏載入可以說是用戶體驗中最重要的環節 二、載入慢的原因 在頁面渲染的過程,導致載入速度慢的因素 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 背景 等值查找,有數組、列表、HashMap等,已經足夠了,範圍查找,該用什麼數據結構呢?下麵介紹java中非常好用的兩個類TreeMap和ConcurrentSkipListMap。 TreeMap的實現基於紅黑樹 每一棵紅黑樹都是一顆二叉排序樹,又稱二叉查找樹(Binary Search Tre ...
  • 在大部分涉及到資料庫操作的項目裡面,事務控制、事務處理都是一個無法迴避的問題。得益於Spring框架的封裝,業務代碼中進行事務控制操作起來也很簡單,直接加個@Transactional註解即可,大大簡化了對業務代碼的侵入性。那麼對@Transactional事務註解瞭解的夠全面嗎?知道有哪些場景可能... ...
  • 寫在前面 這是我在接觸爬蟲後,寫的第二個爬蟲實例。 也是我在學習python後真正意義上寫的第二個小項目,第一個小項目就是第一個爬蟲了。 我從學習python到現在,也就三個星期不到,平時課程比較多,python是額外學習的,每天學習python的時間也就一個小時左右。 所以我目前對於python也 ...
  • 多對一關係是什麼 Django使用django.db.models.ForeignKey定義多對一關係。 ForeignKey需要一個位置參數:與該模型關聯的類 class Info(models.Model): user = models.ForeignKey(other_model,on_del ...
  • 一、什麼是智能指針 一般來講C++中對於指針指向的對象需要使用new主動分配堆空間,在使用結束後還需要主動調用delete釋放這個堆空間。為了使得自動、異常安全的對象生存期管理可行,就出現了智能指針這個概念。簡單來看智能指針是 RAII(Resource Acquisition Is Initial ...
  • 我們在做採集數據的時候,過快或者訪問頻繁,或者一訪問就給彈出驗證碼,然後就蚌珠了~ 今天就給大家來一個簡單處理驗證碼的方法 環境模塊 本文使用的是 Python和pycharm 這裡需要用到一個 ddddocr 模塊 ,這是別人開源寫好的一個東西,簡單又好用,但是精確度差一點點,但是還是非常好用的。 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...