一文搞懂MySQL體系架構!!

寫在前面

不少小夥伴工做很長時間了,對於MySQL的掌握程度卻僅僅停留在表面的CRUD,對於MySQL深層次的原理和技術知識瞭解的少之又少,隨着工做年限的不斷增加,職場競爭力倒是不斷下降的。不少時候,出去面試時,被面試官吊打的現象成了屢見不鮮。好比,對於MySQL的高頻面試題有:程序員

  • 說說MySQL中MVCC機制的原理?
  • MySQL的事務原理和實現?
  • MySQL數據主從複製的原理?
  • MySQL底層數據的存儲結構?
  • 如何使MySQL支持海量數據存儲?
  • MySQL中的鎖機制原理和實現?
  • MySQL索引機制?索引中涉及的數據結構和算法?
  • MySQL爲什麼使用B+樹做爲索引結構?
  • B+樹能夠存放多少數據?
  • 說說MySQL中間隙鎖的實現原理?
  • InnoDB引擎爲什麼會崩潰?說說其實現原理?
  • 等等其餘一系列高頻面試

若是一一列舉的話,大概可以列舉上百個關於MySQL的高頻面試題,這些你都會嗎?面試

不只僅是面試,若是你想從一名底層程序員上升爲高級工程師,架構師等,MySQL的底層原理和技術是你必需要掌握的。算法

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

MySQL體系架構

咱們先來看看MySQL的體系架構圖,以下所示。
數據庫

從MySQL的架構圖,咱們能夠看出MySQL的架構自頂向下大體能夠分爲網絡鏈接層、數據庫服務層、存儲引擎層和系統文件層四大部分。接下來,咱們就來簡單說說每一個部分的組成信息。緩存

網絡鏈接層

網絡鏈接層位於整個MySQL體系架構的最上層,主要擔任客戶端鏈接器的角色。提供與MySQL服務器創建鏈接的能力,幾乎支持全部主流的服務端語言,例如:Java、C、C++、Python等,各語言都是經過各自的API接口與MySQL創建鏈接。安全

數據庫服務層

數據庫服務層是整個數據庫服務器的核心,主要包括了系統管理和控制工具、鏈接池、SQL接口、解析器、查詢優化器和緩存等部分。bash

鏈接池

主要負責存儲和管理客戶端與數據庫的鏈接信息,鏈接池裏的一個線程負責管理一個客戶端到數據庫的鏈接信息。服務器

系統管理和控制工具

提供數據庫系統的管理和控制功能,例如對數據庫中的數據進行備份和恢復,保證整個數據庫的安全性,提供安全管理,對整個數據庫的集羣進行協調和管理等。微信

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

相關文章
相關標籤/搜索