溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中SQL語(yǔ)句執(zhí)行流程是怎么樣的

發(fā)布時(shí)間:2021-10-26 17:21:06 來(lái)源:億速云 閱讀:113 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要介紹MySQL中SQL語(yǔ)句執(zhí)行流程是怎么樣的,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

總的來(lái)說(shuō),MySQL邏輯架構(gòu)可以分為server層和存儲(chǔ)引擎層這兩個(gè)部分。這篇文章記錄的是SQL語(yǔ)句執(zhí)行流程,主要是發(fā)生在server層上面的事。

server層主要包括了MySQL數(shù)據(jù)庫(kù)大多數(shù)的功能,畢竟執(zhí)行SQL大部分是在這一層去實(shí)現(xiàn)的嘛^_^。這一層細(xì)分下來(lái)可以分為:查詢緩存(query cache 有的簡(jiǎn)稱QC),解析器也可叫分析器,預(yù)處理器(其實(shí)也可以歸在分析器里面),查詢優(yōu)化器等。

存儲(chǔ)引擎層主要的工作是存儲(chǔ)、提取數(shù)據(jù)。當(dāng)前主要的存儲(chǔ)引擎種類有:InnoDB,MyISAM,tokuDB等,他們的區(qū)別如下:

MySQL中SQL語(yǔ)句執(zhí)行流程是怎么樣的

在InnoDB和MyISAM這兩種存儲(chǔ)引擎中,當(dāng)前使用較廣的是InnoDB,MyISAM由于不支持事務(wù),不支持行鎖等原因在8.0版本后已經(jīng)被徹底廢棄了。從MySQL5.5版本開(kāi)始,InnoDB成為MySQL數(shù)據(jù)庫(kù)默認(rèn)的存儲(chǔ)引擎。

先說(shuō)結(jié)論吧,一條SQL語(yǔ)句從客戶端發(fā)起后,到MySQL數(shù)據(jù)庫(kù),先會(huì)進(jìn)行一系列驗(yàn)證(比如查詢/更新權(quán)限),接著到查詢緩存,再到解析器,查詢優(yōu)化器,完成執(zhí)行語(yǔ)句的操作從存儲(chǔ)引擎中調(diào)取結(jié)果返回給客戶端。

一、連接&&驗(yàn)證權(quán)限

MySQL的連接主要有兩種方式,一種是從服務(wù)器本地發(fā)起的,通過(guò)root用戶,使用socket登錄,還有一種是我們從客戶端發(fā)起的屬于遠(yuǎn)程連接,一般來(lái)說(shuō)遠(yuǎn)程連接數(shù)據(jù)庫(kù)通常需要輸入的幾個(gè)要素:用戶名、密碼、端口號(hào)、IP地址。

連接首先驗(yàn)證的是密碼是否正確,當(dāng)前用戶在當(dāng)前IP是否有權(quán)限登錄等,登錄完成后,該登錄用戶會(huì)具有當(dāng)前已分配給他的權(quán)限(增刪改查等)。

二、查詢緩存

上一步的驗(yàn)證完成后,SQL執(zhí)行就會(huì)來(lái)到查詢緩存(query cache),看是否有執(zhí)行過(guò)該SQL語(yǔ)句緩存有該SQL執(zhí)行結(jié)果,如果有,直接取出結(jié)果返回給客戶端,如果沒(méi)有則進(jìn)行下一步的查詢。

不可否認(rèn),如果每次都能在查詢緩存中獲取數(shù)據(jù),這個(gè)效率是很高的。但是對(duì)于實(shí)際應(yīng)用中,并不建議使用查詢緩存。因?yàn)椴樵兙彺嬷荒茚槍?duì)靜態(tài)數(shù)據(jù)不能針對(duì)動(dòng)態(tài)數(shù)據(jù),很可能好不容易緩存好的數(shù)據(jù),其中有表發(fā)生了更新,一下子緩存好的數(shù)據(jù)就被清掉了。而在8.0版本后,這功能也被徹底廢棄了,在8.0之前的版本一般是建議關(guān)閉查詢緩存功能的。

三、解析器

在第二步的查詢緩存中沒(méi)能獲取或者說(shuō)沒(méi)能命中查詢緩存,就會(huì)首先進(jìn)行SQL解析,包含語(yǔ)法,語(yǔ)義解析:是要進(jìn)行查詢還是更新操作,語(yǔ)句寫(xiě)的有沒(méi)問(wèn)題之類的,生成一個(gè)解析樹(shù),提交給下一步。

四、預(yù)處理器(其實(shí)也可以歸在解析器里面)

將第三步中解析過(guò)的解析樹(shù)進(jìn)行預(yù)處理,相對(duì)于第三部來(lái)說(shuō)會(huì)進(jìn)行更深層次的判斷,比如表/列是否存在之類的,會(huì)把解析樹(shù)處理為更為平衡的平衡樹(shù)結(jié)構(gòu)。

五、查詢優(yōu)化器

預(yù)處理完成后,來(lái)到查詢優(yōu)化器,這里決定了比如走哪個(gè)索引等,轉(zhuǎn)化前面的平衡樹(shù)為執(zhí)行計(jì)劃,并選出一個(gè)數(shù)據(jù)庫(kù)認(rèn)為是最優(yōu)的執(zhí)行計(jì)劃進(jìn)行SQL的執(zhí)行。

六、SQL執(zhí)行

從存儲(chǔ)引擎層調(diào)取需要的數(shù)據(jù),返回給客戶端,至此,流程結(jié)束。

以上是“MySQL中SQL語(yǔ)句執(zhí)行流程是怎么樣的”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI