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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...