寫了那么多SQL孩灯,它是怎么運(yùn)轉(zhuǎn)的呢抡锈?Mysql的邏輯架構(gòu)基礎(chǔ)

????????數(shù)分第一步语泽,會(huì)寫MySQL畏陕。我們看到很多數(shù)據(jù)分析的基礎(chǔ)教程他們都講了什么是SQL,然后也會(huì)詳細(xì)的告訴你怎么寫增刪改查語句底循,每個(gè)關(guān)鍵詞都詳細(xì)地剖析怎么使用巢株,但是你學(xué)習(xí)了很多SQL基礎(chǔ)知識(shí)以及做了很多SQL練習(xí)題之后還可能是對(duì)SQL一知半解,甚至當(dāng)你面試的時(shí)候做一道你沒遇到過的SQL題或者給你一道SQL讓你分析它的運(yùn)行效率時(shí)熙涤,你就傻眼了阁苞。你知道這是為什么嗎?因?yàn)槲覀儗?duì)MySQL的機(jī)制不了解,也沒有系統(tǒng)化地對(duì)自己學(xué)習(xí)到的SQL知識(shí)進(jìn)行系統(tǒng)化整理祠挫,一遇到實(shí)際問題就傻眼了那槽。那么我們這個(gè)教程就是來告訴大家MySQL的底層是怎么運(yùn)行的。我們所寫的SQL語句它是有一個(gè)怎樣的執(zhí)行順序等舔。在此基礎(chǔ)上學(xué)會(huì)如何對(duì)我們所寫的SQL語句進(jìn)行調(diào)優(yōu)以使他獲得更快的運(yùn)行效率骚灸。當(dāng)然我們不是數(shù)據(jù)工程師,我們知道怎么存數(shù)據(jù)不是為了做存數(shù)據(jù)這個(gè)工作慌植,而是更好更快的取出數(shù)據(jù)甚牲,所以更深入的底層計(jì)算機(jī)知識(shí)我們不涉及,也沒有辦法一一講清楚蝶柿。

????????好丈钙,接下來廢話不多說,萬里高樓平地起只锭,一磚一瓦從頭搭著恩,我們直接開講SQL基本原理和實(shí)戰(zhàn)演練院尔。這個(gè)SQL系列的框架很簡(jiǎn)單蜻展,第一二節(jié)是SQL的部署基本框架和SQL的執(zhí)行邏輯,后面每一節(jié)都是講問題實(shí)戰(zhàn)邀摆,先提出業(yè)務(wù)問題纵顾,分析要去什么數(shù)據(jù),然后分析SQL偽代碼栋盹,最后是實(shí)際寫SQL施逾,取出我們要的結(jié)果,并且嘗試多種方法例获,比較最優(yōu)性能汉额。如果是復(fù)雜查詢,一般會(huì)從自連接榨汤、自定義變量蠕搜、窗口函數(shù)三個(gè)角度去思考。思路可謂是通用收壕、簡(jiǎn)單妓灌、高效轨蛤。最關(guān)鍵是練習(xí)實(shí)踐,碼到不等于學(xué)到虫埂。本系列的面向?qū)ο笫嵌驹鰟h改查知識(shí)的有志于數(shù)據(jù)分析的業(yè)務(wù)人員祥山、數(shù)據(jù)分析師、學(xué)生黨掉伏。我們今天主要講Mysql的邏輯架構(gòu)缝呕。

????????接下來我們看這張圖(圖來源于經(jīng)典書籍《高性能MySQL(第三版)》),上面這張圖告訴我們斧散,當(dāng)我們向MySQL發(fā)送一個(gè)請(qǐng)求的時(shí)候MySQL到底做了什么岳颇。可以看到整個(gè)Mysql程序分為客戶端和服務(wù)器端颅湘』安啵客戶端就是我們寫SQL的地方,有從命令行寫SQL語句的闯参,比如在linux上使用[root@localhost /]# service mysqld start命令啟動(dòng)Mysql客戶端瞻鹏;或者在Windows上運(yùn)行CMD,再輸入mysql -u root -p直接就可以連上Mysql服務(wù)器鹿寨。也有從圖形化客戶端寫SQL的新博,比如說Navicate,他是個(gè)收費(fèi)軟件,功能比較強(qiáng)大脚草,但是我用的比較多的是mysqlworkbench,這是Mysql官方搭配使用的客戶端赫悄,也很方便。還有從Python直接連接Mysql服務(wù)器寫SQL取數(shù)的馏慨。至于怎么連埂淮,我們以后再說。

????????服務(wù)器端是給客戶端提供數(shù)據(jù)查詢服務(wù)的写隶。我們天天都用著數(shù)據(jù)庫倔撞,但是我們都沒有意識(shí)到,比如看某某視頻慕趴,我們?cè)诶锩嫠阉麝P(guān)鍵字的APP就是客戶端痪蝇,輸入關(guān)鍵詞并點(diǎn)擊后,我們的命令就發(fā)送給了背后的服務(wù)器冕房,它經(jīng)過計(jì)算處理給我們反饋數(shù)據(jù)躏啰。那具體到MySQL。當(dāng)我們向MySQL發(fā)送一個(gè)請(qǐng)求的時(shí)候耙册,它會(huì)先去緩存里查詢之前有沒有相同的查詢给僵,如果有就直接返回查詢結(jié)果。(這里存在兩個(gè)問題觅玻,一是最新版本MySQL8.0去掉了緩存這個(gè)功能想际,而是它查詢的機(jī)制用到Hash)培漏。如果沒有緩存數(shù)據(jù),那解析器就會(huì)對(duì)SQL語句進(jìn)行解釋胡本,關(guān)鍵詞是否寫錯(cuò)牌柄,引號(hào)分號(hào)是否正確,語法是否正確侧甫。如果有問題珊佣,就會(huì)返回錯(cuò)誤。如果沒有問題披粟,優(yōu)化器就根據(jù)數(shù)據(jù)庫內(nèi)部的執(zhí)行規(guī)則和機(jī)制開始對(duì)SQL語句進(jìn)行優(yōu)化咒锻,執(zhí)行順序的調(diào)整,執(zhí)行引擎的啟動(dòng)和選擇守屉。優(yōu)化好的SQL語句會(huì)發(fā)送給執(zhí)行器惑艇,執(zhí)行器啟動(dòng)相應(yīng)的查詢引擎從數(shù)據(jù)文件中取出結(jié)果。最后再返回給客戶端拇泛。

1.連接管理和安全驗(yàn)證(connection):MySQL有連接池(connection pool)管理客戶端的連接滨巴。客戶端連接后會(huì)驗(yàn)證用戶名俺叭、密碼和主機(jī)信息等恭取。

2.緩存(cache):緩存就是放進(jìn)內(nèi)存的數(shù)據(jù),前面說過是通過Hash機(jī)制保存的熄守,內(nèi)部比較復(fù)雜蜈垮,不展開。它可以加快取數(shù)速度裕照。斷電丟失攒发;占用計(jì)算資源。

3.解析器(parser):將SQL命令分解成數(shù)據(jù)結(jié)構(gòu)(解析樹)牍氛,后續(xù)的操作基于這個(gè)結(jié)構(gòu)進(jìn)行分解晨继。

4.優(yōu)化器(optimizer):官方教程里說明在執(zhí)行SQL查詢時(shí)會(huì)根據(jù)開銷自動(dòng)選擇最優(yōu)的查詢方案烟阐,先選擇where中的行數(shù)搬俊,同時(shí)選擇要選擇的列,而不是全部的列蜒茄,最后把內(nèi)容合并到一起唉擂。

5.執(zhí)行器:包含執(zhí)行SQL命令,獲取返回結(jié)果檀葛,生成執(zhí)行計(jì)劃等玩祟。

6.存儲(chǔ)引擎:訪問物理文件的驅(qū)動(dòng)器,可以理解為發(fā)動(dòng)機(jī)屿聋。執(zhí)行器驅(qū)動(dòng)存儲(chǔ)引擎到數(shù)據(jù)表文件中訪問和計(jì)算數(shù)據(jù)空扎。

????????從這個(gè)流程我們可以知道影響一條SQL語句的因素有以下這些:數(shù)據(jù)類型及數(shù)據(jù)量(數(shù)據(jù)總量越大掃描越慢)藏鹊、數(shù)據(jù)庫架構(gòu)設(shè)計(jì)(存儲(chǔ)引擎,不同的表結(jié)構(gòu)設(shè)計(jì)對(duì)應(yīng)于不同業(yè)務(wù)側(cè)重不同的增刪改查转锈,熱數(shù)據(jù)和冷數(shù)據(jù)的增刪改查重點(diǎn)是不一樣的)盘寡、計(jì)算機(jī)硬件性能(數(shù)據(jù)計(jì)算和通信傳輸?shù)哪芰Γ€有就是作為數(shù)據(jù)分析師常寫的Query語句撮慨,前面三個(gè)因素是數(shù)據(jù)庫管理員考慮的竿痰,而最后一個(gè)是數(shù)據(jù)分析師可以做的,SQL語句寫的好不僅可以快速取出數(shù)據(jù)也可以減輕服務(wù)器壓力砌溺,降低成本影涉。我有SQL進(jìn)階的系列總結(jié)文章,歡迎關(guān)注閱讀规伐。

最后歡迎大家關(guān)注我蟹倾,我是拾陸,搜索公眾號(hào)“二八Data”猖闪,更多技術(shù)干貨持續(xù)奉獻(xiàn)喊式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萧朝,隨后出現(xiàn)的幾起案子岔留,更是在濱河造成了極大的恐慌,老刑警劉巖检柬,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件献联,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡何址,警方通過查閱死者的電腦和手機(jī)里逆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來用爪,“玉大人原押,你說我怎么就攤上這事≠搜” “怎么了诸衔?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)颇玷。 經(jīng)常有香客問我笨农,道長(zhǎng),這世上最難降的妖魔是什么帖渠? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任谒亦,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘份招。我一直安慰自己切揭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布锁摔。 她就那樣靜靜地躺著伴箩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鄙漏。 梳的紋絲不亂的頭發(fā)上嗤谚,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音怔蚌,去河邊找鬼巩步。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桦踊,可吹牛的內(nèi)容都是我干的椅野。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼籍胯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竟闪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杖狼,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤炼蛤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝶涩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體理朋,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年绿聘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗽上。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熄攘,死狀恐怖兽愤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挪圾,我是刑警寧澤浅萧,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站洛史,受9級(jí)特大地震影響惯殊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜也殖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忆嗜,春花似錦己儒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绩卤,卻和暖如春途样,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背濒憋。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工何暇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凛驮。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓裆站,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親黔夭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宏胯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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