最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL執(zhí)行SQL語句的流程詳解

 更新時間:2022年09月25日 17:04:46   作者:zht245648124  
這篇文章主要介紹了MySQL執(zhí)行SQL語句的流程詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

1、通常sql執(zhí)行流程

用戶發(fā)起請求到業(yè)務服務器,執(zhí)行sql語句時,先到連接池中獲取連接,然后到mysql服務器執(zhí)行查詢。

1.1 問題1:MySQL誰去處理網(wǎng)絡請求?

msyql服務器誰負責從這個連接中去監(jiān)聽這個網(wǎng)絡請求?誰負責從網(wǎng)絡連接里把數(shù)據(jù)讀出來?

其實大家都知道,網(wǎng)絡連接必須得分配一個線程去處理,由一個線程來監(jiān)聽和讀取請求數(shù)據(jù),比如從網(wǎng)絡連接中讀取和解析出來一條發(fā)過去的sql語句,

如下圖所示:

1.2 問題2:MySQL如何執(zhí)行sql語句?

  • 接著我們思考一下,當mysql內(nèi)部的工作線程從一個網(wǎng)絡連接中讀取出來一個sql語句之后,此時會如何執(zhí)行這個sql語句呢?
  • 如果要執(zhí)行這個sql,去完成底層的數(shù)據(jù)增刪改查,其實是一項極其復雜的任務了。Mysql內(nèi)部首先提供一個組件,就是SQL接口(SQL Interface),他是一套執(zhí)行sql語句的接口,專門用于執(zhí)行我們發(fā)送給mysql的那些增刪改查的sql語句。
  • 因此mysql工作線程接收到SQL語句后,就會轉交給SQL接口去執(zhí)行,

如下圖:

1.3 查詢解析器

MySQL怎么看懂和理解這些SQL?比如現(xiàn)在有個這樣的SQL,我們?nèi)四X處理一下,只要懂SQL語法的人,立馬就明白什么意思了。但是MySQL是一個數(shù)據(jù)庫管理系統(tǒng),他是沒法直接理解這些SQL語句的!此時就有一個關鍵組件出場了:查詢解析器。

查詢解析器(Parser)是負責對SQL語句進行解析的,比如上面那個sql語句進行一下拆解,可以拆解為以下幾部分:

  • 要從『users』表里查詢數(shù)據(jù)
  • 查詢『id』字段等于1的那行數(shù)據(jù)
  • 對查詢出來的那行數(shù)據(jù)要提取里面『id,name,age』三個字段

所謂的SQL解析,就是按照既定的sql語法,對我們按照sql語法規(guī)則編寫的sql語句進行解析,然后理解這個sql語句要干什么事情,

如下圖所示:

1.4 查詢優(yōu)化器

當通過解析器理解了SQL要干什么之后,并不是馬上去執(zhí)行,而是要通過查詢優(yōu)化器(Optimizer)來選擇一個最優(yōu)的查詢路徑。就以上面那個sql查詢?yōu)槔?,看下所謂最優(yōu)查詢路徑是什么。

要完成這個事,我們有以下幾個查詢路徑:

  • 查詢路徑1:直接定位到『users』表中的『ID』字段等于1的那一行數(shù)據(jù),然后取那行數(shù)據(jù)的『id,name,age』三個字段值就行了;
  • 查詢路徑2:先把『users』表中每一行數(shù)據(jù)的『id,name,age』三個字段的值都查出來,然后從這批數(shù)據(jù)里過了出『id』字段等于1的那行數(shù)據(jù)。

上面就是一個最簡單的SQL語句的兩種實現(xiàn)路徑,要完成這個sql語句的目標,兩個路徑都可以做到,但哪一種更好呢?顯然感覺上第一種查詢路徑更好一些。

所以查詢優(yōu)化器就是針對你編寫的幾十行、幾百行甚至上千行的復雜sql語句生成查詢路徑樹,然后從里面選擇一條最優(yōu)的查詢路徑出來。相當于他告訴sql執(zhí)行器,按照一個什么樣的步驟和順序,去執(zhí)行哪些操作,然后一步一步把SQL語句就完成了。

1.5 存儲引擎

數(shù)據(jù)庫就是一個編程語言寫出來的系統(tǒng)而已,然后啟動之后也是個進程,執(zhí)行池里面的各種代碼,也就是我們上面所說的那些東西。所以對數(shù)據(jù)庫而言,我們的數(shù)據(jù)要不然是放在內(nèi)存里,要不然是放在磁盤文件里,沒什么特殊的地方!所以我們來思考一下,假設我們的數(shù)據(jù)有的存放在內(nèi)存里,有的存放在磁盤文件里如下圖所示。

那么問題來了,我們執(zhí)行的時候是先更新內(nèi)存數(shù)據(jù)?還是磁盤數(shù)據(jù)?我們?nèi)绻雀麓疟P數(shù)據(jù),是先查詢哪個磁盤文件,再更新哪個磁盤文件?

這個時候就需要存儲引擎了。存儲引擎其實就是執(zhí)行sql語句的,它會按照一定的步驟去查詢內(nèi)存緩存數(shù)據(jù),更新磁盤數(shù)據(jù),查詢磁盤數(shù)據(jù)等等,執(zhí)行一系列數(shù)據(jù)的操作,

如下圖所示:

MySQL的架構設計中,SQL接口、SQL解析器、查詢優(yōu)化器都是用的一套組件。但是存儲引擎像插件一樣,支持各種各樣的存儲引擎的,比如我們常見的InnoDB、MylSam、Momery等。我們可以自由選擇哪種存儲引擎來負責具體的SQL執(zhí)行。不過現(xiàn)在大家一般都使用InnoDB作為MySQL的存儲引擎。

1.6 執(zhí)行器

那么看完存儲引擎之后,我們知道存儲引擎可以幫助我們?nèi)ピL問內(nèi)存以及磁盤上的數(shù)據(jù),那么是誰來調(diào)用存儲引擎的接口呢?其實我們現(xiàn)在還漏了一個執(zhí)行器的概念,這個執(zhí)行器會根據(jù)優(yōu)化器選擇的執(zhí)行方案,去調(diào)用存儲引擎的接口按照一定的順序和步驟,就把SQL語句的邏輯給執(zhí)行了

舉個例子,比如執(zhí)行器可能會先調(diào)用存儲引擎的一個接口,去獲取“usrs”表中的第一行數(shù)據(jù),然后判斷一下這個數(shù)據(jù)的"id”字段的值是否等于我們期望的一個值,如果不是的話,那就繼續(xù)調(diào)用存儲引擎的接口,去獲取“users”表的下一行數(shù)據(jù)。

就是基于上述的思路,執(zhí)行器就會去根據(jù)我們的優(yōu)化器生成的一套執(zhí)行計劃,然后不停的調(diào)用存儲引擎的各種接口去完成SQL語句的執(zhí)行計劃,大致就是不停的更新或者提取一些數(shù)據(jù)出來。如下圖所示:

2、總結

我們再來總結下MySQL的執(zhí)行流程:

  • 用戶發(fā)起請求到tomcat服務器,tomcat服務器中線程開始執(zhí)行sql 語句
  • 首先線程從數(shù)據(jù)庫的連接池中獲取一個連接,建立與MySQL數(shù)據(jù)庫服務器的連接
  • MySQL的工作線程接收到SQL語句后,轉交給SQL接口去執(zhí)行
  • 查詢解析器對SQL進行語法拆解,理解這個SQL要干什么
  • 查詢優(yōu)化器選擇最優(yōu)的查詢路徑,生成SQL的執(zhí)行順序和步驟
  • 執(zhí)行器將sql執(zhí)行計劃交給底層的存儲引擎接口去執(zhí)行,他按照一定的步驟去查詢內(nèi)存數(shù)據(jù)、更新磁盤數(shù)據(jù)等等

執(zhí)行過程如下圖所示:

到此這篇關于MySQL執(zhí)行SQL語句的流程詳解的文章就介紹到這了,更多相關MySQL執(zhí)行SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • centos 6.5下 mysql-community-server. 5.7.18-1.el6安裝

    centos 6.5下 mysql-community-server. 5.7.18-1.el6安裝

    這篇文章主要介紹了centos 6.5下 mysql-community-server. 5.7.18-1.el6安裝,需要的朋友可以參考下
    2017-04-04
  • MySQL和PolarDB的相同點及不同點解讀

    MySQL和PolarDB的相同點及不同點解讀

    這篇文章主要介紹了MySQL和PolarDB的相同點及不同點,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • MySQL緩存優(yōu)化方案總結

    MySQL緩存優(yōu)化方案總結

    最近迭代的產(chǎn)品版本從2.X來到了3.X,屬于一個非常大的產(chǎn)品升級,比上個版本多了很多功能,那么上線之前肯定要在一個干凈的環(huán)境里進行測試回歸以及性能測試,本文總結一下數(shù)據(jù)庫層面的一些緩存機制對查詢速度整體的優(yōu)化,需要的朋友可以參考下
    2023-08-08
  • 開源MySQL高效數(shù)據(jù)倉庫解決方案:Infobright詳細介紹

    開源MySQL高效數(shù)據(jù)倉庫解決方案:Infobright詳細介紹

    這篇文章主要介紹了開源MySQL高效數(shù)據(jù)倉庫解決方案:Infobright詳細介紹,本文講解了Infobright特征、Infobright的價值、Infobright的適用場景、與MySQL對比等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • MySQL索引介紹及優(yōu)化方式

    MySQL索引介紹及優(yōu)化方式

    這篇文章主要介紹了MySQL索引介紹及優(yōu)化方式,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • centos7上mysql8.0rpm方式安裝教程圖解

    centos7上mysql8.0rpm方式安裝教程圖解

    這篇文章主要介紹了centos7上mysql8.0rpm方式安裝教程,本文圖文并茂給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • MySQL數(shù)據(jù)庫查詢進階之多表查詢詳解

    MySQL數(shù)據(jù)庫查詢進階之多表查詢詳解

    Mysql數(shù)據(jù)庫是web開發(fā)中最常用的數(shù)據(jù)庫之一,mysql多表查詢是開發(fā)人員必備的技能,下面這篇文章主要給大家介紹了關于MySQL數(shù)據(jù)庫查詢進階之多表查詢的相關資料,需要的朋友可以參考下
    2022-04-04
  • mysql下mysqladmin日常管理命令總結(必看篇)

    mysql下mysqladmin日常管理命令總結(必看篇)

    下面小編就為大家?guī)硪黄猰ysql下mysqladmin日常管理命令總結(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • MySQL數(shù)據(jù)庫如何導入導出(備份還原)

    MySQL數(shù)據(jù)庫如何導入導出(備份還原)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫如何導入導出(備份還原),需要的朋友可以參考下
    2015-10-10
  • Windows免安裝MySQL?8.0.28?版本圖文教程

    Windows免安裝MySQL?8.0.28?版本圖文教程

    這篇文章主要為大家詳細介紹了Windows免安裝MySQL8.0.28版本圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

莱芜市| 吉隆县| 平乐县| 含山县| 湄潭县| 侯马市| 邢台市| 丰台区| 扬州市| 北流市| 印江| 勃利县| 天全县| 上饶县| 蓬莱市| 南陵县| 贵定县| 阿克陶县| 彝良县| 绩溪县| 锡林浩特市| 苏尼特左旗| 凌海市| 晋中市| 大荔县| 丹巴县| 盖州市| 蒲江县| 新民市| 福清市| 宜良县| 宁远县| 常山县| 巴塘县| 临猗县| 连云港市| 久治县| 开封市| 墨玉县| 兴山县| 南川市|