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
  • Github / Gitee QQ群(1群) : 813100564 / QQ群(2群) : 579033769 視頻教學 介紹 MiniWord .NET Word模板引擎,藉由Word模板和數據簡單、快速生成文件。 Getting Started 安裝 nuget link : https:// ...
  • Array.Sort Array類中相當實用的我認為是Sort方法,相比起冗長的冒泡排序,它的出現讓排序更加的簡化 結果如下: 還可以聲明一個靜態方法用來專門調用指定數組排序,從名為 array 的一維數組中 a 索引處開始,到 b 元素 從小到大排序。 註意: a + b 不能大於 array 的 ...
  • 前言 在上一篇文章CLR類型系統概述里提到,當運行時掛起時, 垃圾回收會執行堆棧遍歷器(stack walker)去拿到堆棧上值類型的大小和堆棧根。這裡我們來翻譯BotR里一篇專門介紹Stackwalking的文章,希望能加深理解。 順便說一句,StackWalker在中文里似乎還沒有統一的翻譯,J ...
  • 使用過 nginx 的小伙伴應該都知道,這個中間件是可以設置跨域的,作為今天的主角,同樣的 反向代理中間件的 YARP 毫無意外也支持了跨域請求設置。 有些小伙伴可能會問了,怎樣才算是跨域呢? 在 HTML 中,一些標簽,例如 img、a 等,還有我們非常熟悉的 Ajax,都是可以指向非本站的資源的 ...
  • 什麼是Git Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。 Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的 ...
  • 首先CR3是什麼,CR3是一個寄存器,該寄存器內保存有頁目錄表物理地址(PDBR地址),其實CR3內部存放的就是頁目錄表的記憶體基地址,運用CR3切換可實現對特定進程記憶體地址的強制讀寫操作,此類讀寫屬於有痕讀寫,多數驅動保護都會將這個地址改為無效,此時CR3讀寫就失效了,當然如果能找到CR3的正確地址... ...
  • 說明 onlyoffice為一款開源的office線上編輯組件,提供word/excel/ppt編輯保存操作 以下操作均基於centos8系統,officeonly鏡像版本7.1.2.23 鏡像下載地址:https://yunpan.360.cn/surl_y87CKKcPdY4 (提取碼:1f92 ...
  • 二叉樹查找指定的節點 前序查找的思路 1.先判斷當前節點的no是否等於要查找的 2.如果是相等,則返回當前節點 3.如果不等,則判斷當前節點的左子節點是否為空,如果不為空,則遞歸前序查找 4.如果左遞歸前序查找,找到節點,則返回,否繼續判斷,當前的節點的右子節點是否為空,如果不為空,則繼續向右遞歸前 ...
  • ##Invalid bound statement (not found)出現原因和解決方法 ###前言: 想必各位小伙伴在碼路上經常會碰到奇奇怪怪的事情,比如出現Invalid bound statement (not found),那今天我就來分析以下出現此問題的原因。 其實出現這個問題實質就是 ...
  • ###一、背景知識 爬蟲的本質就是一個socket客戶端與服務端的通信過程,如果我們有多個url待爬取,只用一個線程且採用串列的方式執行,那隻能等待爬取一個結束後才能繼續下一個,效率會非常低。 需要強調的是:對於單線程下串列N個任務,並不完全等同於低效,如果這N個任務都是純計算的任務,那麼該線程對c ...