MySQL筆記之基礎(chǔ)架構(gòu)


一嚎研、背景

為什么我先學(xué)習(xí)MySQL的基礎(chǔ)架構(gòu)呢? 原因很簡單, 當(dāng)我們需要了解一項(xiàng)新事物的時候, 我們只有站在宏觀的層面, 才能層層的去理解問題, 舉個例子, 我們要看一個框架的源碼, 一開始鉆研進(jìn)去研究, 發(fā)現(xiàn)就有點(diǎn) "丈二的和尚摸不著頭腦"罢低。因?yàn)槲覀儧]有自己的了解他,不知道他的入口在哪钥屈?

看一個事兒千萬不要直接陷入細(xì)節(jié)里辅肾,你應(yīng)該先鳥瞰其全貌,這樣能夠幫助你從高維度理解問題

<MySQL 45 講>

二、MySQL 基本架構(gòu)

(MySQL 邏輯架構(gòu)圖)


從圖中我們可以清晰的看到, SQL 語句在MySQL的各個功能模塊中的執(zhí)行過程, 總結(jié)一下可以分為 Server 層 和 存儲引擎 兩個部分术健。

  1. Server層

    Server層包括連接器、查詢緩存粘衬、分析器荞估、優(yōu)化器、執(zhí)行器等稚新,涵蓋了 MySQL 的大多數(shù)核心服務(wù)功能, 以及所有的內(nèi)置函數(shù) (如 時間, 日期, 數(shù)學(xué)函數(shù) 等), 所有跨存儲引擎的功能都在這實(shí)現(xiàn), 存儲過程, 視圖, 觸發(fā)器等.

  2. 存儲引擎

    存儲引擎負(fù)責(zé)數(shù)據(jù)的存儲和提取勘伺。架構(gòu)模式是插件式的,支持InnoDB, MyISAM, Memory等 多個存儲引擎. MySQL 5.5.5 版本開始, InnoDB 成為默認(rèn)存儲引擎褂删。


連接器

  • 功能作用:負(fù)責(zé)跟客戶端建立連接飞醉、獲取權(quán)限、維持和管理連接屯阀,如用戶名密碼認(rèn)證通過缅帘,連接器會到權(quán)限表里面查出你擁有的權(quán)限。之后蹲盘,這個連接里面的權(quán)限判斷邏輯股毫,都將依賴于此時讀到的權(quán)限。修改完成后召衔,只有再新建的連接才會使用新的權(quán)限設(shè)置

  • 連接對象:MySQL 在執(zhí)行過程中臨時使用的內(nèi)存是管理在連接對象里面的铃诬,這些資源會在連接斷開的時候才釋放。

  • 注意點(diǎn):

    • 在用戶成功連接后,即使你用管理員賬號對該用戶進(jìn)行了權(quán)限更改,也不會影響已經(jīng)存在連接的權(quán)限苍凛。如果想要權(quán)限生效趣席,只有在新建的連接才會使用新的權(quán)限設(shè)置。

    在這里我們要了解兩個點(diǎn):長連接和短連接的概念醇蝴。

    數(shù)據(jù)庫里面宣肚,長連接是指連接成功后,如果客戶端持續(xù)有請求悠栓,則一直使用同一個連接霉涨。短連接則是指每次執(zhí)行完很少的幾次查詢就斷開連接按价,下次查詢再重新建立一個。

    長鏈接在數(shù)據(jù)庫中笙瑟,每次建立連接是比較復(fù)雜的楼镐,所以在使用中盡量減少建立連接的動作,就是使用長鏈接往枷。
  • 長連接引發(fā)的思考:

    • 風(fēng)險問題:MySQL在執(zhí)行過程中臨時使用的內(nèi)存是管理在連接里面的, 這些資源只有斷開的時候才會釋放, 長連接累積下來框产,可能會導(dǎo)致內(nèi)存占用過大,被系統(tǒng)強(qiáng)行殺掉(OOM)

    • 解決方案:定期斷開長鏈接,使用一段時間错洁,或者執(zhí)行一個占用內(nèi)存大的查詢后秉宿,斷開連接,在進(jìn)行重連屯碴。如果使用的是MySQL5.7或者更新的版本, 在每次執(zhí)行比較大的操作后,通過 mysql_reset_connection重新初始化連接資源, 這個過程中不需要重連和進(jìn)行權(quán)限驗(yàn)證的,但是會恢復(fù)到剛剛創(chuàng)建的狀態(tài)描睦。

查詢緩存

  • 存儲方式:是以 key-value的形式進(jìn)行緩存在內(nèi)存中的,key 是查詢的語句导而,value 是查詢的結(jié)果酌摇。如果你的查詢能夠直接在這個緩存中找到 key,那么這個 value 就會被直接返回給客戶端嗡载。

  • 風(fēng)險:大多數(shù)情況下我會建議你不要使用查詢緩存,為什么呢仍稀?因?yàn)椴樵兙彺嫱状笥诶莨觥2樵兙彺娴氖Х浅nl繁,只要有對一個表的更新技潘,這個表上所有的查詢緩存都會被清空遥巴。MySQL 8.0 版本直接將查詢緩存的整塊功能刪掉了,也就是說 8.0 開始徹底沒有這個功能了享幽。

分析器

  • 詞法分析:識別出 SQL 語句里面的字符串分別是什么铲掐,代表什么,把 SQL 語句中字符串 T 識別成“表名 T值桩,把字符串 ID 識別成 列ID

  • 語法分析:根據(jù)詞法分析的結(jié)果摆霉,語法分析器會根據(jù)語法規(guī)則,判斷你輸入的這個 SQL 語句是否滿足 MySQL 語法

優(yōu)化器

  • 功能作用:優(yōu)化器是在表里面有多個索引的時候奔坟,決定使用哪個索引携栋;或者在一個語句有多表關(guān)聯(lián)(join)的時候,決定各個表的連接順序

優(yōu)化器

  • 查詢語句

    • 調(diào)用 InnoDB 引擎接口取這個表的第一行咳秉,判斷 ID 值是不是 5婉支,如果不是則跳過,如果是則將這行存在結(jié)果集中

    • 調(diào)用引擎接口取 下一行澜建,重復(fù)相同的判斷邏輯向挖,直到取到這個表的最后一行

    • 執(zhí)行器將上述遍歷過程中所有滿足條件的行組成的記錄集作為結(jié)果集返回給客戶端

  • 更新語句

    • 執(zhí)行器先找引擎取 ID=2 這一行蝌以,ID 是主鍵,引擎直接用樹搜索找到這一行何之,如果 ID=2 這一行所在的數(shù)據(jù)頁本來就在內(nèi)存中跟畅,就直接返回給執(zhí)行器,否則帝美,需要先從磁盤讀入內(nèi)存碍彭,然后再返回。

    • 執(zhí)行器拿到引擎給的行數(shù)據(jù)悼潭,把這個值加上 1庇忌,比如原來是 N,現(xiàn)在就是 N+1舰褪,得到新的一行數(shù)據(jù)皆疹,再調(diào)用引擎接口寫入這行新數(shù)據(jù)

    • 引擎將這行新數(shù)據(jù)更新到內(nèi)存中,同時將這個更新操作記錄到 redo log 里面占拍,此時 redo log 處于 prepare 狀態(tài)略就。然后告知執(zhí)行器執(zhí)行完成了,隨時可以提交事務(wù)

    • 執(zhí)行器生成這個操作的 binlog晃酒,并把 binlog 寫入磁盤

    • 執(zhí)行器調(diào)用引擎的提交事務(wù)接口表牢,引擎把剛剛寫入的 redo log 改成提交(commit)狀態(tài),更新完成

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贝次,一起剝皮案震驚了整個濱河市崔兴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛔翅,老刑警劉巖敲茄,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異山析,居然都是意外死亡堰燎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘫寝,你說我怎么就攤上這事∧窨睿” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵茂卦,是天一觀的道長何什。 經(jīng)常有香客問我,道長等龙,這世上最難降的妖魔是什么处渣? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任伶贰,我火速辦了婚禮,結(jié)果婚禮上罐栈,老公的妹妹穿的比我還像新娘黍衙。我一直安慰自己,他們只是感情好荠诬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布琅翻。 她就那樣靜靜地躺著,像睡著了一般柑贞。 火紅的嫁衣襯著肌膚如雪方椎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天钧嘶,我揣著相機(jī)與錄音棠众,去河邊找鬼。 笑死有决,一個胖子當(dāng)著我的面吹牛闸拿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播书幕,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼新荤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了台汇?” 一聲冷哼從身側(cè)響起迟隅,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎励七,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奔缠,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掠抬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了校哎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片两波。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闷哆,靈堂內(nèi)的尸體忽然破棺而出腰奋,到底是詐尸還是另有隱情,我是刑警寧澤抱怔,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布劣坊,位于F島的核電站,受9級特大地震影響屈留,放射性物質(zhì)發(fā)生泄漏局冰。R本人自食惡果不足惜测蘑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望康二。 院中可真熱鬧碳胳,春花似錦、人聲如沸沫勿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽产雹。三九已至诫惭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洽故,已是汗流浹背贝攒。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留时甚,地道東北人隘弊。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像荒适,于是被迫代替她去往敵國和親梨熙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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