一文搞懂MySQL體系架構(gòu);恋瘛!
文章已收錄到:
https://github.com/sunshinelyz/technology-binghe
https://gitee.com/binghe001/technology-binghe
MySQL體系架構(gòu)
我們先來看看MySQL的體系架構(gòu)圖闭翩,如下所示。注:圖片來自互聯(lián)網(wǎng)
從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谓厘。