總的來講,MySQL 能夠當作是二層架構,第一層咱們一般叫作SQL Layer,在MySQL 數
據庫系統處理底層數據以前的全部工做都是在這一層完成的,包括權限判斷,sql 解析,執
行計劃優化,query cache 的處理等等;第二層就是存儲引擎層,咱們一般叫作Storage
Engine Layer,也就是底層數據存取操做實現部分,由多種存儲引擎共同組成。因此,能夠
用以下一張最簡單的架構示意圖來表示MySQL 的基本架構,如圖2-1 所示:
圖2-1
雖然從上圖看起來MySQL 架構很是的簡單,就是簡單的兩部分而已,但實際上每一層中
都含有各自的不少小模塊,尤爲是第一層SQL Layer,結構至關複雜的。下面咱們就分別針
對SQL Layer 和Storage Engine Layer 作一個簡單的分析。
SQL Layer 中包含了多個子模塊,下面我將逐個作一下簡單的介紹:
一、初始化模塊
顧名思議,初始化模塊就是在MySQL Server 啓動的時候,對整個系統作各類各樣的初
始化操做,好比各類buffer,cache 結構的初始化和內存空間的申請,各類系統變量的初始
化設定,各類存儲引擎的初始化設置,等等。
二、核心API
核心API 模塊主要是爲了提供一些須要很是高效的底層操做功能的優化實現,包括各類
底層數據結構的實現,特殊算法的實現,字符串處理,數字處理等,小文件I/O,格式化輸
出,以及最重要的內存管理部分。核心API 模塊的全部源代碼都集中在mysys 和strings
文件夾下面,有興趣的讀者能夠研究研究。
三、網絡交互模塊
底層網絡交互模塊抽象出底層網絡交互所使用的接口api,實現底層網絡數據的接收與
發送,以方便其餘各個模塊調用,以及對這一部分的維護。全部源碼都在vio 文件夾下面。
四、Client & Server 交互協議模塊
任何C/S 結構的軟件系統,都確定會有本身獨有的信息交互協議,MySQL 也不例外。MySQL
的Client & Server 交互協議模塊部分,實現了客戶端與MySQL 交互過程當中的全部協議。
固然這些協議都是創建在現有的OS 和網絡協議之上的,如TCP/IP 以及Unix Socket。
五、用戶模塊
用戶模塊所實現的功能,主要包括用戶的登陸鏈接權限控制和用戶的受權管理。他就像
MySQL 的大門守衛同樣,決定是否給來訪者「開門」。
六、訪問控制模塊
造訪客人進門了就能夠想幹嗎就幹嗎麼?爲了安全考慮,確定不能如此隨意。這時候就
須要訪問控制模塊實時監控客人的每個動做,給不一樣的客人以不一樣的權限。訪問控制模塊
實現的功能就是根據用戶模塊中各用戶的受權信息,以及數據庫自身特有的各類約束,來控
制用戶對數據的訪問。用戶模塊和訪問控制模塊二者結合起來,組成了MySQL 整個數據庫系
統的權限安全管理的功能。
七、鏈接管理、鏈接線程和線程管理
鏈接管理模塊負責監聽對MySQL Server 的各類請求,接收鏈接請求,轉發全部鏈接請
求到線程管理模塊。每個鏈接上MySQL Server 的客戶端請求都會被分配(或建立)一個
鏈接線程爲其單獨服務。而鏈接線程的主要工做就是負責MySQL Server 與客戶端的通訊,
接受客戶端的命令請求,傳遞Server 端的結果信息等。線程管理模塊則負責管理維護這些
鏈接線程。包括線程的建立,線程的cache 等。
八、Query 解析和轉發模塊
在MySQL 中咱們習慣將全部Client 端發送給Server 端的命令都稱爲query,在MySQL
Server 裏面,鏈接線程接收到客戶端的一個Query 後,會直接將該query 傳遞給專門負責
將各類Query 進行分類而後轉發給各個對應的處理模塊,這個模塊就是query 解析和轉發模
塊。其主要工做就是將query 語句進行語義和語法的分析,而後按照不一樣的操做類型進行分
類,而後作出針對性的轉發。
九、Query Cache 模塊
Query Cache 模塊在MySQL 中是一個很是重要的模塊,他的主要功能是將客戶端提交給
MySQL 的Select 類query 請求的返回結果集cache 到內存中,與該query 的一個hash 值作
一個對應。該Query 所取數據的基表發生任何數據的變化以後,MySQL 會自動使該query 的
Cache 失效。在讀寫比例很是高的應用系統中,Query Cache 對性能的提升是很是顯著的。
固然它對內存的消耗也是很是大的。
十、Query 優化器模塊
Query 優化器,顧名思義,就是優化客戶端請求的query,根據客戶端請求的query 語
句,和數據庫中的一些統計信息,在一系列算法的基礎上進行分析,得出一個最優的策略,
告訴後面的程序如何取得這個query 語句的結果。
十一、表變動管理模塊
表變動管理模塊主要是負責完成一些DML 和DDL 的query,如:update,delte,insert,
create table,alter table 等語句的處理。
十二、表維護模塊
表的狀態檢查,錯誤修復,以及優化和分析等工做都是表維護模塊須要作的事情。
1三、系統狀態管理模塊
系統狀態管理模塊負責在客戶端請求系統狀態的時候,將各類狀態數據返回給用戶,像
DBA 經常使用的各類show status 命令,show variables 命令等,所獲得的結果都是由這個模塊
返回的。
1四、表管理器
這個模塊從名字上看來很容易和上面的表變動和表維護模塊相混淆,可是其功能與變動
及維護模塊卻徹底不一樣。你們知道,每個MySQL 的表都有一個表的定義文件,也就是*.frm
文件。表管理器的工做主要就是維護這些文件,以及一個cache,該cache 中的主要內容是
各個表的結構信息。此外它還維護table 級別的鎖管理。
1五、日誌記錄模塊
日誌記錄模塊主要負責整個系統級別的邏輯層的日誌的記錄,包括error log,binary
log,slow query log 等。
1六、複製模塊
複製模塊又可分爲Master 模塊和Slave 模塊兩部分, Master 模塊主要負責在
Replication 環境中讀取Master 端的binary 日誌,以及與Slave 端的I/O 線程交互等工做。
Slave 模塊比Master 模塊所要作的事情稍多一些,在系統中主要體如今兩個線程上面。一
個是負責從Master 請求和接受binary 日誌,並寫入本地relay log 中的I/O 線程。另一
個是負責從relay log 中讀取相關日誌事件,而後解析成能夠在Slave 端正確執行並獲得和
Master 端徹底相同的結果的命令並再交給Slave 執行的SQL 線程。
1七、存儲引擎接口模塊
存儲引擎接口模塊能夠說是MySQL 數據庫中最有特點的一點了。目前各類數據庫產品
中,基本上只有MySQL 能夠實現其底層數據存儲引擎的插件式管理。這個模塊實際上只是一
個抽象類,但正是由於它成功地將各類數據處理高度抽象化,才成就了今天MySQL 可插拔存
儲引擎的特點。