欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

1.1 問(wèn)題1:MySQL誰(shuí)去處理網(wǎng)絡(luò)請(qǐng)求?

msyql服務(wù)器誰(shuí)負(fù)責(zé)從這個(gè)連接中去監(jiān)聽(tīng)這個(gè)網(wǎng)絡(luò)請(qǐng)求?誰(shuí)負(fù)責(zé)從網(wǎng)絡(luò)連接里把數(shù)據(jù)讀出來(lái)?

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

如下圖所示:

1.2 問(wèn)題2:MySQL如何執(zhí)行sql語(yǔ)句?

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

如下圖:

1.3 查詢解析器

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

查詢解析器(Parser)是負(fù)責(zé)對(duì)SQL語(yǔ)句進(jìn)行解析的,比如上面那個(gè)sql語(yǔ)句進(jìn)行一下拆解,可以拆解為以下幾部分:

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

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

如下圖所示:

1.4 查詢優(yōu)化器

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

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

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

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

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

1.5 存儲(chǔ)引擎

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

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

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

如下圖所示:

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

1.6 執(zhí)行器

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

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

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

2、總結(jié)

我們?cè)賮?lái)總結(jié)下MySQL的執(zhí)行流程:

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

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

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

相關(guān)文章

  • 詳細(xì)講述MySQL中的子查詢操作

    詳細(xì)講述MySQL中的子查詢操作

    這篇文章主要介紹了詳細(xì)講述MySQL中的子查詢操作,文中也給出了具體的代碼實(shí)例講解,需要的朋友可以參考下
    2015-04-04
  • mysql中的事務(wù)重做日志(redo log)與回滾日志(undo log)

    mysql中的事務(wù)重做日志(redo log)與回滾日志(undo log)

    這篇文章主要介紹了mysql中的事務(wù)重做日志(redo log)與回滾日志(undo log),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 實(shí)例講解MySQL統(tǒng)計(jì)庫(kù)表大小

    實(shí)例講解MySQL統(tǒng)計(jì)庫(kù)表大小

    這篇文章主要介紹了MySQL統(tǒng)計(jì)庫(kù)表大小的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Mysql Explain命令的使用與分析

    Mysql Explain命令的使用與分析

    今天小編就為大家分享一篇關(guān)于Mysql Explain命令的使用與分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • mysql 使用B+樹索引有哪些優(yōu)勢(shì)

    mysql 使用B+樹索引有哪些優(yōu)勢(shì)

    這篇文章主要介紹了mysql 使用B+樹索引有哪些優(yōu)勢(shì),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-01-01
  • MySQL之權(quán)限以及設(shè)計(jì)數(shù)據(jù)庫(kù)案例講解

    MySQL之權(quán)限以及設(shè)計(jì)數(shù)據(jù)庫(kù)案例講解

    這篇文章主要介紹了MySQL之權(quán)限以及設(shè)計(jì)數(shù)據(jù)庫(kù)案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 一個(gè)小時(shí)學(xué)會(huì)MySQL數(shù)據(jù)庫(kù)(張果)

    一個(gè)小時(shí)學(xué)會(huì)MySQL數(shù)據(jù)庫(kù)(張果)

    當(dāng)前大量的網(wǎng)站使用php語(yǔ)言,那么對(duì)應(yīng)的就是mysql數(shù)據(jù)庫(kù),這里就為大家分享一下MySQL數(shù)據(jù)庫(kù)的相關(guān)知識(shí),希望大家多多支持腳本之家
    2018-01-01
  • MySQL5.7.31 64位免安裝版使用教程圖解

    MySQL5.7.31 64位免安裝版使用教程圖解

    這篇文章主要介紹了MySQL5.7.31 64位免安裝版使用教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • MySQL中查詢當(dāng)天數(shù)據(jù)中離時(shí)間點(diǎn)最近的數(shù)據(jù)(兩種方法)

    MySQL中查詢當(dāng)天數(shù)據(jù)中離時(shí)間點(diǎn)最近的數(shù)據(jù)(兩種方法)

    在 MySQL 中,你可以使用 ORDER BY 和 LIMIT 語(yǔ)句來(lái)查詢當(dāng)天數(shù)據(jù)中離指定時(shí)間最近的數(shù)據(jù),本文給大家介紹MySQL中查詢當(dāng)天數(shù)據(jù)中離時(shí)間點(diǎn)最近的數(shù)據(jù),感興趣的朋友一起看看吧
    2023-12-12
  • MySQL數(shù)據(jù)xtrabackup物理備份的方式

    MySQL數(shù)據(jù)xtrabackup物理備份的方式

    Xtrabackup是開(kāi)源免費(fèi)的支持MySQL 數(shù)據(jù)庫(kù)熱備份的軟件,在 Xtrabackup 包中主要有 Xtrabackup 和 innobackupex 兩個(gè)工具,本文給大家介紹MySQL數(shù)據(jù)xtrabackup物理備份方法,感興趣的朋友跟隨小編一起看看吧
    2023-10-10

最新評(píng)論