一文搞懂MySQL體系架構(gòu)@哪!

寫在前面

很多小伙伴工作很長時間了键俱,對于MySQL的掌握程度卻僅僅停留在表面的CRUD佣谐,對于MySQL深層次的原理和技術知識了解的少之又少,隨著工作年限的不斷增長方妖,職場競爭力卻是不斷降低的。很多時候罚攀,出去面試時党觅,被面試官吊打的現(xiàn)象成了家常便飯。比如斋泄,對于MySQL的高頻面試題有:

  • 說說MySQL中MVCC機制的原理杯瞻?
  • MySQL的事務原理和實現(xiàn)?
  • MySQL數(shù)據(jù)主從復制的原理炫掐?
  • MySQL底層數(shù)據(jù)的存儲結(jié)構(gòu)魁莉?
  • 如何使MySQL支持海量數(shù)據(jù)存儲?
  • MySQL中的鎖機制原理和實現(xiàn)募胃?
  • MySQL索引機制旗唁?索引中涉及的數(shù)據(jù)結(jié)構(gòu)和算法?
  • MySQL為何使用B+樹作為索引結(jié)構(gòu)痹束?
  • B+樹可以存放多少數(shù)據(jù)检疫?
  • 說說MySQL中間隙鎖的實現(xiàn)原理?
  • InnoDB引擎為何會崩潰祷嘶?說說其實現(xiàn)原理屎媳?
  • 等等其他一系列高頻面試

如果一一列舉的話,大概能夠列舉上百個關于MySQL的高頻面試題论巍,這些你都會嗎烛谊?

不僅僅是面試,如果你想從一名底層程序員上升為高級工程師嘉汰,架構(gòu)師等丹禀,MySQL的底層原理和技術是你必須要掌握的。

注:冰河后續(xù)會不定時連載MySQL底層原理和技術的文章,與小伙伴們一起死磕MySQL湃崩,將冰河掌握的MySQL底層技術分享給大家荧降,在面試時吊打面試官,在工作中吊打其他小伙伴攒读。

MySQL體系架構(gòu)

我們先來看看MySQL的體系架構(gòu)圖朵诫,如下所示。


image

從MySQL的架構(gòu)圖薄扁,我們可以看出MySQL的架構(gòu)自頂向下大致可以分為網(wǎng)絡連接層剪返、數(shù)據(jù)庫服務層、存儲引擎層和系統(tǒng)文件層四大部分邓梅。接下來脱盲,我們就來簡單說說每個部分的組成信息。

網(wǎng)絡連接層

網(wǎng)絡連接層位于整個MySQL體系架構(gòu)的最上層日缨,主要擔任客戶端連接器的角色钱反。提供與MySQL服務器建立連接的能力,幾乎支持所有主流的服務端語言匣距,例如:Java面哥、C、C++毅待、Python等尚卫,各語言都是通過各自的API接口與MySQL建立連接。

數(shù)據(jù)庫服務層

數(shù)據(jù)庫服務層是整個數(shù)據(jù)庫服務器的核心尸红,主要包括了系統(tǒng)管理和控制工具吱涉、連接池、SQL接口外里、解析器怎爵、查詢優(yōu)化器和緩存等部分。

連接池

主要負責存儲和管理客戶端與數(shù)據(jù)庫的連接信息盅蝗,連接池里的一個線程負責管理一個客戶端到數(shù)據(jù)庫的連接信息疙咸。

系統(tǒng)管理和控制工具

提供數(shù)據(jù)庫系統(tǒng)的管理和控制功能,例如對數(shù)據(jù)庫中的數(shù)據(jù)進行備份和恢復风科,保證整個數(shù)據(jù)庫的安全性撒轮,提供安全管理,對整個數(shù)據(jù)庫的集群進行協(xié)調(diào)和管理等贼穆。

SQL接口

主要負責接收客戶端發(fā)送過來的各種SQL命令题山,并將SQL命令發(fā)送到其他部分,并接收其他部分返回的結(jié)果數(shù)據(jù)故痊,將結(jié)果數(shù)據(jù)返回給客戶端顶瞳。

解析樹

主要負責對請求的SQL解析成一棵“解析樹”,然后根據(jù)MySQL中的一些規(guī)則對“解析樹”做進一步的語法驗證,確認其是否合法慨菱。

查詢優(yōu)化器

在MySQL中焰络,如果“解析樹”通過了解析器的語法檢查,此時就會由優(yōu)化器將其轉(zhuǎn)化為執(zhí)行計劃符喝,然后與存儲引擎進行交互闪彼,通過存儲引擎與底層的數(shù)據(jù)文件進行交互。

緩存

MySQL的緩存是由一系列的小緩存組成的协饲。例如:MySQL的表緩存畏腕,記錄緩存,MySQL中的權(quán)限緩存茉稠,引擎緩存等描馅。MySQL中的緩存能夠提高數(shù)據(jù)的查詢性能,如果查詢的結(jié)果能夠命中緩存而线,則MySQL會直接返回緩存中的結(jié)果信息铭污。

存儲引擎層

MySQL中的存儲引擎層主要負責數(shù)據(jù)的寫入和讀取,與底層的文件進行交互膀篮。值得一提的是嘹狞,MySQL中的存儲引擎是插件式的,服務器中的查詢執(zhí)行引擎通過相關的接口與存儲引擎進行通信各拷,同時,接口屏蔽了不同存儲引擎之間的差異闷营。MySQL中烤黍,最常用的存儲引擎就是InnoDB和MyISAM。

InnoDB和MyISAM存儲引擎需要小伙伴們重點掌握傻盟,高頻面試考點速蕊,也是成為架構(gòu)師必知必會的內(nèi)容。

系統(tǒng)文件層

系統(tǒng)文件層主要包括MySQL中存儲數(shù)據(jù)的底層文件娘赴,與上層的存儲引擎進行交互规哲,是文件的物理存儲層。其存儲的文件主要有:日志文件诽表、數(shù)據(jù)文件唉锌、配置文件、MySQL的進行pid文件和socket文件等竿奏。

日志文件

MySQL中的日志主要包括:錯誤日志袄简、通用查詢?nèi)罩尽⒍M制日志泛啸、慢查詢?nèi)罩镜取?/p>

  • 錯誤日志

主要存儲的是MySQL運行過程中產(chǎn)生的錯誤信息绿语。可以使用下面的SQL語句來查看MySQL中的錯誤日志。

show variables like '%log_error%';
  • 通用查詢?nèi)罩?/li>

主要記錄MySQL運行過程中的一般查詢信息吕粹,可以使用下面的SQL語句來查看MySQL中的通用查詢?nèi)罩疚募?/p>

show variables like '%general%';
  • 二進制日志

主要記錄對MySQL數(shù)據(jù)庫執(zhí)行的插入种柑、修改和刪除操作,并且也會記錄SQL語句執(zhí)行的時間匹耕、執(zhí)行的時長聚请,但是二進制日志不記錄select、show等不修改數(shù)據(jù)庫的SQL泌神。主要用于恢復數(shù)據(jù)庫的數(shù)據(jù)和實現(xiàn)MySQL主從復制良漱。

查看二進制日志是否開啟。

show variables like '%log_bin%';

查看二進制日志的參數(shù)

show variables like '%binlog%'

查看日志文件

show binary logs;
  • 慢查詢?nèi)罩?/li>

慢查詢主要記錄的是執(zhí)行時間超過指定時間的SQL語句欢际,這個時間默認是10秒母市。

查看是否開啟慢查詢?nèi)罩?/p>

show variables like '%slow_query%';

查看慢查詢設置的時長

show variables like '%long_query_time%'

數(shù)據(jù)文件

數(shù)據(jù)文件中主要包括了:db.opt文件、frm文件损趋、MYD文件患久、MYI文件、ibd文件浑槽、ibdata文件蒋失、ibdata1文件、ib_logfile0和ib_logfile1文件等桐玻。

  • db.opt文件

主要記錄當前數(shù)據(jù)庫使用的字符集和檢驗規(guī)則等信息篙挽。

  • frm文件

存儲數(shù)據(jù)表的結(jié)構(gòu)信息,主要是數(shù)據(jù)表相關的元數(shù)據(jù)信息镊靴,包括數(shù)據(jù)表的表結(jié)構(gòu)定義信息铣卡,每張表都會有一個frm文件。

值得注意的是:MySQL8版本中的innodb存儲引擎的表沒有frm文件偏竟。(后面專門寫一些MySQL8新特性的文章煮落,從使用到底層原理與MySQL5到底有何不同)。

  • MYD文件

MyISAM存儲引擎專用的文件格式踊谋,主要存放MyISAM存儲引擎數(shù)據(jù)表中的數(shù)據(jù)蝉仇,每張MyISAM存儲引擎表對應一個.MYD文件。

  • MYI文件

MyISAM存儲引擎專用的文件格式殖蚕,主要存放與MyISAM存儲引擎數(shù)據(jù)表相關的索引信息轿衔,每張MyISAM存儲引擎表對應一個.MYI文件。

  • ibd文件

存放Innodb存儲引擎的數(shù)據(jù)文件和索引文件睦疫,主要存放的是獨享表空間的數(shù)據(jù)和索引呀枢,每張表對應一個.ibd文件。

  • ibdata文件

存放Innodb存儲引擎的數(shù)據(jù)文件和索引文件笼痛,主要存放的是共享表空間的數(shù)據(jù)和索引裙秋,所有表共用一個(或者多個).ibdata文件琅拌,可以根據(jù)配置來指定共用的.ibdata文件個數(shù)。

  • ibdata1文件

MySQL的系統(tǒng)表空間數(shù)據(jù)文件摘刑,主要存儲MySQL的數(shù)據(jù)表元數(shù)據(jù)进宝、Undo日志等信息。

  • ib_logfile0和ib_logfile1文件

MySQL數(shù)據(jù)庫中的Redo log文件枷恕,主要用于MySQL實現(xiàn)事務的持久性党晋。如果在某個時間點MySQL發(fā)生了故障,此時如果有臟頁沒有寫入到數(shù)據(jù)庫的ibd文件中徐块,在重啟MySQL的時候未玻,MySQL會根據(jù)Redo Log信息進行重做,將寫入Redo Log并且尚未寫入數(shù)據(jù)表的數(shù)據(jù)進行持久化操作胡控。

配置文件

用于存在MySQL所有的配置信息扳剿,在Unix/Linux環(huán)境中是my,cnf文件,在Windows環(huán)境中是my.ini文件昼激。

pid文件

pid文件是存放MySQL進程運行時的進程號的文件庇绽,主要存在于Unix/Linux環(huán)境中,具體的存儲目錄可以在my.cnf或者my.ini文件中進行配置橙困。

socket文件

socket文件和pid文件一樣瞧掺,都是MySQL在Unix/Linux環(huán)境中運行才會有的文件。在Unix/Linux環(huán)境中凡傅,客戶端可以直接通過socket來連接MySQL辟狈。

肝不動了,原創(chuàng)不易夏跷,小伙伴們點個贊哼转,給個在看和轉(zhuǎn)發(fā)吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拓春,隨后出現(xiàn)的幾起案子释簿,更是在濱河造成了極大的恐慌亚隅,老刑警劉巖硼莽,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異煮纵,居然都是意外死亡懂鸵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門行疏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匆光,“玉大人,你說我怎么就攤上這事酿联≈障ⅲ” “怎么了夺巩?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長周崭。 經(jīng)常有香客問我柳譬,道長,這世上最難降的妖魔是什么续镇? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任美澳,我火速辦了婚禮,結(jié)果婚禮上摸航,老公的妹妹穿的比我還像新娘制跟。我一直安慰自己,他們只是感情好酱虎,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布雨膨。 她就那樣靜靜地躺著,像睡著了一般逢净。 火紅的嫁衣襯著肌膚如雪哥放。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天爹土,我揣著相機與錄音甥雕,去河邊找鬼。 笑死胀茵,一個胖子當著我的面吹牛社露,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琼娘,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼峭弟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脱拼?” 一聲冷哼從身側(cè)響起瞒瘸,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熄浓,沒想到半個月后情臭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赌蔑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年俯在,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃惯。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡跷乐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趾浅,到底是詐尸還是另有隱情愕提,我是刑警寧澤馒稍,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站浅侨,受9級特大地震影響筷黔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仗颈,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一佛舱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挨决,春花似錦请祖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盖高,卻和暖如春慎陵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喻奥。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工席纽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撞蚕。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓润梯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甥厦。 傳聞我的和親對象是個殘疾皇子纺铭,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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