寫在前面
很多小伙伴作業很長時間了,對于MySQL的掌握程度卻僅僅停留在表面的CRUD,對于MySQL深層次的原理和技術知識了解的少之又少,隨著作業年限的不斷增長,職場競爭力卻是不斷降低的,很多時候,出去面試時,被面試官吊打的現象成了家常便飯,比如,對于MySQL的高頻面試題有:
- 說說MySQL中MVCC機制的原理?
- MySQL的事務原理和實作?
- MySQL資料主從復制的原理?
- MySQL底層資料的存盤結構?
- 如何使MySQL支持海量資料存盤?
- MySQL中的鎖機制原理和實作?
- MySQL索引機制?索引中涉及的資料結構和演算法?
- MySQL為何使用B+樹作為索引結構?
- B+樹可以存放多少資料?
- 說說MySQL中間隙鎖的實作原理?
- InnoDB引擎為何會崩潰?說說其實作原理?
- 等等其他一系列高頻面試
如果一一列舉的話,大概能夠列舉上百個關于MySQL的高頻面試題,這些你都會嗎?
不僅僅是面試,如果你想從一名底層程式員上升為高級工程師,架構師等,MySQL的底層原理和技術是你必須要掌握的,
注:冰河后續會不定時連載MySQL底層原理和技術的文章,與小伙伴們一起死磕MySQL,將冰河掌握的MySQL底層技術分享給大家,在面試時吊打面試官,在作業中吊打其他小伙伴,
文章已收錄到:
https://github.com/sunshinelyz/technology-binghe
https://gitee.com/binghe001/technology-binghe
MySQL體系架構
我們先來看看MySQL的體系架構圖,如下所示,

從MySQL的架構圖,我們可以看出MySQL的架構自頂向下大致可以分為網路連接層、資料庫服務層、存盤引擎層和系統檔案層四大部分,接下來,我們就來簡單說說每個部分的組成資訊,
網路連接層
網路連接層位于整個MySQL體系架構的最上層,主要擔任客戶端連接器的角色,提供與MySQL服務器建立連接的能力,幾乎支持所有主流的服務端語言,例如:Java、C、C++、Python等,各語言都是通過各自的API介面與MySQL建立連接,
資料庫服務層
資料庫服務層是整個資料庫服務器的核心,主要包括了系統管理和控制工具、連接池、SQL介面、決議器、查詢優化器和快取等部分,
連接池
主要負責存盤和管理客戶端與資料庫的連接資訊,連接池里的一個執行緒負責管理一個客戶端到資料庫的連接資訊,
系統管理和控制工具
提供資料庫系統的管理和控制功能,例如對資料庫中的資料進行備份和恢復,保證整個資料庫的安全性,提供安全管理,對整個資料庫的集群進行協調和管理等,
SQL介面
主要負責接收客戶端發送過來的各種SQL命令,并將SQL命令發送到其他部分,并接收其他部分回傳的結果資料,將結果資料回傳給客戶端,
決議樹
主要負責對請求的SQL決議成一棵“決議樹”,然后根據MySQL中的一些規則對“決議樹”做進一步的語法驗證,確認其是否合法,
查詢優化器
在MySQL中,如果“決議樹”通過了決議器的語法檢查,此時就會由優化器將其轉化為執行計劃,然后與存盤引擎進行互動,通過存盤引擎與底層的資料檔案進行互動,
快取
MySQL的快取是由一系列的小快取組成的,例如:MySQL的表快取,記錄快取,MySQL中的權限快取,引擎快取等,MySQL中的快取能夠提高資料的查詢性能,如果查詢的結果能夠命中快取,則MySQL會直接回傳快取中的結果資訊,
存盤引擎層
MySQL中的存盤引擎層主要負責資料的寫入和讀取,與底層的檔案進行互動,值得一提的是,MySQL中的存盤引擎是插件式的,服務器中的查詢執行引擎通過相關的介面與存盤引擎進行通信,同時,介面屏蔽了不同存盤引擎之間的差異,MySQL中,最常用的存盤引擎就是InnoDB和MyISAM,
InnoDB和MyISAM存盤引擎需要小伙伴們重點掌握,高頻面試考點,也是成為架構師必知必會的內容,
系統檔案層
系統檔案層主要包括MySQL中存盤資料的底層檔案,與上層的存盤引擎進行互動,是檔案的物理存盤層,其存盤的檔案主要有:日志檔案、資料檔案、組態檔、MySQL的進行pid檔案和socket檔案等,
日志檔案
MySQL中的日志主要包括:錯誤日志、通用查詢日志、二進制日志、慢查詢日志等,
- 錯誤日志
主要存盤的是MySQL運行程序中產生的錯誤資訊,可以使用下面的SQL陳述句來查看MySQL中的錯誤日志,
show variables like '%log_error%';
- 通用查詢日志
主要記錄MySQL運行程序中的一般查詢資訊,可以使用下面的SQL陳述句來查看MySQL中的通用查詢日志檔案,
show variables like '%general%';
- 二進制日志
主要記錄對MySQL資料庫執行的插入、修改和洗掉操作,并且也會記錄SQL陳述句執行的時間、執行的時長,但是二進制日志不記錄select、show等不修改資料庫的SQL,主要用于恢復資料庫的資料和實作MySQL主從復制,
查看二進制日志是否開啟,
show variables like '%log_bin%';
查看二進制日志的引數
show variables like '%binlog%'
查看日志檔案
show binary logs;
- 慢查詢日志
慢查詢主要記錄的是執行時間超過指定時間的SQL陳述句,這個時間默認是10秒,
查看是否開啟慢查詢日志
show variables like '%slow_query%';
查看慢查詢設定的時長
show variables like '%long_query_time%'
資料檔案
資料檔案中主要包括了:db.opt檔案、frm檔案、MYD檔案、MYI檔案、ibd檔案、ibdata檔案、ibdata1檔案、ib_logfile0和ib_logfile1檔案等,
- db.opt檔案
主要記錄當前資料庫使用的字符集和檢驗規則等資訊,
- frm檔案
存盤資料表的結構資訊,主要是資料表相關的元資料資訊,包括資料表的表結構定義資訊,每張表都會有一個frm檔案,
值得注意的是:MySQL8版本中的innodb存盤引擎的表沒有frm檔案,(后面專門寫一些MySQL8新特性的文章,從使用到底層原理與MySQL5到底有何不同),
- MYD檔案
MyISAM存盤引擎專用的檔案格式,主要存放MyISAM存盤引擎資料表中的資料,每張MyISAM存盤引擎表對應一個.MYD檔案,
- MYI檔案
MyISAM存盤引擎專用的檔案格式,主要存放與MyISAM存盤引擎資料表相關的索引資訊,每張MyISAM存盤引擎表對應一個.MYI檔案,
- ibd檔案
存放Innodb存盤引擎的資料檔案和索引檔案,主要存放的是獨享表空間的資料和索引,每張表對應一個.ibd檔案,
- ibdata檔案
存放Innodb存盤引擎的資料檔案和索引檔案,主要存放的是共享表空間的資料和索引,所有表共用一個(或者多個).ibdata檔案,可以根據配置來指定共用的.ibdata檔案個數,
- ibdata1檔案
MySQL的系統表空間資料檔案,主要存盤MySQL的資料表元資料、Undo日志等資訊,
- ib_logfile0和ib_logfile1檔案
MySQL資料庫中的Redo log檔案,主要用于MySQL實作事務的持久性,如果在某個時間點MySQL發生了故障,此時如果有臟頁沒有寫入到資料庫的ibd檔案中,在重啟MySQL的時候,MySQL會根據Redo Log資訊進行重做,將寫入Redo Log并且尚未寫入資料表的資料進行持久化操作,
組態檔
用于存在MySQL所有的配置資訊,在Unix/Linux環境中是my,cnf檔案,在Windows環境中是my.ini檔案,
pid檔案
pid檔案是存放MySQL行程運行時的行程號的檔案,主要存在于Unix/Linux環境中,具體的存盤目錄可以在my.cnf或者my.ini檔案中進行配置,
socket檔案
socket檔案和pid檔案一樣,都是MySQL在Unix/Linux環境中運行才會有的檔案,在Unix/Linux環境中,客戶端可以直接通過socket來連接MySQL,
肝不動了,原創不易,小伙伴們點個贊,給個在看和轉發吧
好了,今天就到這兒吧,我是冰河,大家有啥問題可以在下方留言,也可以加我微信:sun_shine_lyz,我拉你進群,一起交流技術,一起進階,一起牛逼~~
CSDN認證博客專家
分布式與微服務
大資料與云計算
云原生
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/266353.html
標籤:其他
上一篇:BUG:Elasticsearch 集群健康值: 未連接
下一篇:NoSQL之Redis配置與優化
