一文搞懂MySQL體系架構!!

冰河團隊發表於2021-04-13

寫在前面

很多小夥伴工作很長時間了,對於MySQL的掌握程度卻僅僅停留在表面的CRUD,對於MySQL深層次的原理和技術知識瞭解的少之又少,隨著工作年限的不斷增長,職場競爭力卻是不斷降低的。很多時候,出去面試時,被面試官吊打的現象成了家常便飯。比如,對於MySQL的高頻面試題有:

  • 說說MySQL中MVCC機制的原理?
  • MySQL的事務原理和實現?
  • MySQL資料主從複製的原理?
  • MySQL底層資料的儲存結構?
  • 如何使MySQL支援海量資料儲存?
  • MySQL中的鎖機制原理和實現?
  • MySQL索引機制?索引中涉及的資料結構和演算法?
  • MySQL為何使用B+樹作為索引結構?
  • B+樹可以存放多少資料?
  • 說說MySQL中間隙鎖的實現原理?
  • InnoDB引擎為何會崩潰?說說其實現原理?
  • 等等其他一系列高頻面試

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

不僅僅是面試,如果你想從一名底層程式設計師上升為高階工程師,架構師等,MySQL的底層原理和技術是你必須要掌握的。

注:冰河後續會不定時連載MySQL底層原理和技術的文章,與小夥伴們一起死磕MySQL,將冰河掌握的MySQL底層技術分享給大家,在面試時吊打面試官,在工作中吊打其他小夥伴。

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,我拉你進群,一起交流技術,一起進階,一起牛逼~~

相關文章