一條SQL語句是如何執(zhí)行的

一邀泉、架構(gòu)

在討論MySQL前其徙,一條SQL語句是怎樣執(zhí)行之前胚迫,我們首先了解下MySQL中有那些組件。

大體來說唾那,MySQL 可以分為 Server層存儲引擎層兩部分访锻。

Server層包括連接器、查詢緩存、分析器朗若、優(yōu)化器恼五、執(zhí)行器等昌罩,涵蓋 MySQL 的大多數(shù)核心服務(wù)功能哭懈,以及所有的內(nèi)置函數(shù)(如日期、時(shí)間茎用、數(shù)學(xué)和加密函數(shù)等)遣总,所有跨存儲引擎的功能都在這一層實(shí)現(xiàn),比如存儲過程轨功、觸發(fā)器旭斥、視圖等。

存儲引擎層負(fù)責(zé)數(shù)據(jù)的存儲和提取古涧。其架構(gòu)模式是插件式的垂券,支持 InnoDB、MyISAM羡滑、Memory 等多個(gè)存儲引擎」阶Γ現(xiàn)在最常用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始成為了默認(rèn)存儲引擎柒昏。不同的存儲引擎共用一個(gè)Server 層凳宙。

MySQL邏輯架構(gòu)圖

二、組件

連接器

首先职祷,客戶端要連接上數(shù)據(jù)庫氏涩,這時(shí)由連接器來進(jìn)行建立連接、獲取權(quán)限有梆、維持和管理連接是尖。

通過客戶端工具和服務(wù)端建立連接,完成經(jīng)典的TCP握手泥耀,連接器就開始認(rèn)證身份了饺汹,如果認(rèn)證通過,連接器會在權(quán)限表中查出當(dāng)前賬號擁有的權(quán)限爆袍,之后這個(gè)連接里面的權(quán)限判斷邏輯首繁,都將依賴于此時(shí)讀到的權(quán)限。

連接完成后陨囊,如果你沒有后續(xù)的動作弦疮,這個(gè)連接就處于空閑狀態(tài)≈┐祝客戶端如果太長時(shí)間沒動靜胁塞,連接器就會自動將它斷開。這個(gè)時(shí)間是由參數(shù) wait_timeout 控制的,默認(rèn)值是 8 小時(shí)啸罢。

查詢緩存

連接建立完成后编检,你就可以執(zhí)行 select 語句了。執(zhí)行邏輯就會來到第二步:查詢緩存扰才。

MySQL 拿到一個(gè)查詢請求后允懂,會先到查詢緩存看看,之前是不是執(zhí)行過這條語句衩匣。之前執(zhí)行過的語句及其結(jié)果可能會以 key-value 對的形式蕾总,被直接緩存在內(nèi)存中。如果查詢時(shí)命中琅捏,則會直接將對應(yīng)的v返回給客戶端生百,如果語句不在查詢緩存中,就會繼續(xù)后面的執(zhí)行階段柄延。執(zhí)行完成后蚀浆,執(zhí)行結(jié)果會被存入查詢緩存中。

但是搜吧,查詢緩存的失效是很容易的市俊,只要對表進(jìn)行了修改,這張表上的緩存都會被清空赎败,這樣設(shè)計(jì)避免了查詢到臟數(shù)據(jù)秕衙。但也造成緩存命中率非常低,MySQL 8.0及之后就刪除了這塊功能了僵刮。

分析器

如果沒有命中查詢緩存据忘,就要開始真正執(zhí)行語句了。首先搞糕,MySQL 需要知道你要做什么勇吊,因此需要對 SQL 語句做解析。

分析器先會做“詞法分析”窍仰。你輸入的是由多個(gè)字符串和空格組成的一條 SQL 語句汉规,MySQL 需要識別出里面的字符串分別是什么,代表什么驹吮。

之后针史,就要做“語法分析”。根據(jù)詞法分析的結(jié)果碟狞,語法分析器會根據(jù)語法規(guī)則啄枕,判斷你輸入的這個(gè) SQL 語句是否滿足 MySQL 語法。

優(yōu)化器

經(jīng)過了分析器族沃,MySQL 就知道你要做什么了频祝。在開始執(zhí)行之前泌参,還要先經(jīng)過優(yōu)化器的處理。

優(yōu)化器是在表里面有多個(gè)索引的時(shí)候常空,決定使用哪個(gè)索引沽一;或者在一個(gè)語句有多表關(guān)聯(lián)(join)的時(shí)候,決定各個(gè)表的連接順序漓糙。

執(zhí)行器

MySQL 通過分析器知道了你要做什么铣缠,通過優(yōu)化器知道了該怎么做,于是就進(jìn)入了執(zhí)行器階段兼蜈,開始執(zhí)行語句攘残。

開始執(zhí)行的時(shí)候拙友,要先判斷一下你對這個(gè)表有沒有執(zhí)行查詢的權(quán)限为狸,如果沒有,就會返回沒有權(quán)限的錯(cuò)誤遗契。

如果有權(quán)限辐棒,就打開表繼續(xù)執(zhí)行。打開表的時(shí)候牍蜂,執(zhí)行器就會根據(jù)表的引擎定義漾根,去使用這個(gè)引擎提供的接口將結(jié)果集返回給客戶端。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲫竞,一起剝皮案震驚了整個(gè)濱河市辐怕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌从绘,老刑警劉巖寄疏,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異僵井,居然都是意外死亡陕截,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門批什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來农曲,“玉大人,你說我怎么就攤上這事驻债∪楣妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵合呐,是天一觀的道長暮的。 經(jīng)常有香客問我,道長合砂,這世上最難降的妖魔是什么青扔? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任源织,我火速辦了婚禮,結(jié)果婚禮上微猖,老公的妹妹穿的比我還像新娘谈息。我一直安慰自己,他們只是感情好凛剥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布侠仇。 她就那樣靜靜地躺著,像睡著了一般犁珠。 火紅的嫁衣襯著肌膚如雪逻炊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天犁享,我揣著相機(jī)與錄音余素,去河邊找鬼。 笑死炊昆,一個(gè)胖子當(dāng)著我的面吹牛桨吊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凤巨,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼视乐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敢茁?” 一聲冷哼從身側(cè)響起佑淀,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彰檬,沒想到半個(gè)月后伸刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僧叉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年奕枝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶堕。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隘道,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郎笆,到底是詐尸還是另有隱情谭梗,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布宛蚓,位于F島的核電站激捏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凄吏。R本人自食惡果不足惜远舅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一闰蛔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧图柏,春花似錦序六、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至裁着,卻和暖如春繁涂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背二驰。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工扔罪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诸蚕。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓步势,卻偏偏與公主長得像,于是被迫代替她去往敵國和親背犯。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容