若是能在頭腦中構建出一幅MySQL各組件之間如何協同工做的架構圖,就會有助於深刻理解MySQL服務器java
第一層的服務並非MySQL所獨有的,大多數基於網絡的客戶端、服務器的工具或者服務都有相似的架構。好比鏈接處理、受權認證、安全等等。這裏的客戶端能夠理解爲PHP,python,javapython
第二層架構是MySQL大多數核心服務功能,包括查詢解析,分析,優化,緩存以及全部的內置函數(日期,時間,數字和加密函數)全部跨存儲引擎的功能都在這一層實現:存儲過程,觸發器,視圖等mysql
第三層包含了存儲引擎。存儲引擎負責MySQL中數據的存儲和提取。和GNU/Linux下的各個文件系統同樣,每一個存儲引擎都有它的優點和劣勢。服務器經過api與存儲引擎進行通訊。這些接口屏蔽了不一樣存儲引擎之間的差別,使得這些差別對上層的查詢過程透明。存儲引擎API包含幾十個底層函數,用於執行諸如「開始一個事物」或者「根據主鍵提取一行記錄」可是存儲引擎不會去解析SQL,不一樣的存儲引擎也不會相互通訊,而只是簡單地響應上層服務器的請求。linux
更詳細的一份執行流程圖
1 啓動
經過命令net start mysql(windows) / service mysql start(linux)啓動MySQL服務算法
調用初始模塊;初始化模塊就是在數據庫啓動的時候,對整個數據庫作的一些初始化操做,好比各類系統環境變量的初始化,各類緩存,存儲引擎初始化設置等。sql
核心api:MySQL數據庫核心api主要實現了數據庫底層操做的優化功能,其中主要包括IO操做、格式化輸出、高性能存儲數據結果算法的優化,字符串的處理,其中最重要的是內存管理。數據庫
2 鏈接
用戶發送一條SQL,這個時候會被網絡交互模塊監聽到用戶的操做請求,傳遞給‘鏈接管理模塊’windows
接收到請求轉發到‘進/線程鏈接模塊’api
調用‘用戶模塊’來進行權限檢測(訪問數據庫的權限)緩存
經過檢測以後就會去‘鏈接進/線程模塊’從‘線程鏈接池’中查找空閒的被緩存的鏈接線程和客戶端請求對接,若是失敗則建立一個新的鏈接請求
返回鏈接線程
網絡交互模塊:對外提供能夠接收和發送數據的api接口,其餘模塊須要交互的時候,能夠經過api接口調用
鏈接管理模塊、進/線程鏈接模塊、線程鏈接池:鏈接管理模塊負責監聽MySQL Server的各類請求,根據不一樣的請求,而後轉發到線程管理模塊,每一個客戶請求都會被數據庫自動分配一個獨立的線程爲其單獨服務,而鏈接線程的主要工做就是負責MySQL Server與客戶端通訊,線程管理模塊負責管理這些生成的線程。
3 處理
在用戶權限校驗成功以後,而且得到新的鏈接池以後就會去‘命令分發器’,判斷命令的類型若是是select就會去訪問‘查詢緩存’,若是沒有就會往下執行;
若是是select,而且開啓’查詢緩存’以後就會去緩存中查詢是否有與之相匹配的SQL,若是有就會校驗用戶訪問該數據的權限,經過就返回不經過就會返回錯誤信息. 若是數據沒有就會往下執行
會記錄過程當中的SQL操做過程到日誌文件中
在第8,9步 沒有知足相應條件以後往下執行進入 ‘命令解析器’,通過詞法分析,語法分析後生成解析樹
根據操做轉到對應的模塊處理(預處理階段),根據SQL選擇執行的模塊
模塊收到請求後,經過’訪問控制模塊’檢查所鏈接的用戶是否有訪問目標表和目標字段的權限(是指訪問這些數據的權限)
有權限’表管理模塊’先查看table cache中是否存在,有則直接對應的表和獲取鎖,負責從新打開表文件
根據表的ENGINE數據,獲取表的存儲引擎類型等信息
經過接口調用對應的存儲引擎處理
返回查詢以後數據內容
用戶模塊:主要功能是用於控制用戶登入鏈接的權限和用戶受權管理。
訪問控制模塊:主要用於監控用戶的每個操做。訪問控制模塊實現的功能就是根據用戶模塊中不一樣的用戶受權,以及根據其數據庫的各類約束來控制用戶對數據的訪問。用戶模塊和訪問控制模塊結合起來,就組成了MySQL數據庫的權限管理功能。
查詢優化器:這個模塊主要是講客戶端發送的查詢請求,在以前算法的基礎上分析,計算出一個最優的查詢策略,優化以後會提升查詢訪問的速度,最後根據其最優策略返回查詢語句。
表變動管理模塊:主要負責完成DML和DDl的查詢,列如,insert,update,delete,create table,alter table等語句處理。
表維護模塊:主要用於檢測表的狀態,分析,優化表結構,以及修復表。
複製模塊:複製模塊分爲Master模塊和Slave模塊兩部分。Master模塊主要負責複製環境中讀取Master端的binary日誌,以及Slave端的I/O線程交互等工做。
狀態模塊:在客戶端請求系統狀態的時候,系統狀態模塊主要負責將各類狀態的數據返回給用戶。最經常使用的一些查詢狀態的命令包括show status,show variable等,都是經過這個模塊負責返回的。
表管理模塊:主要就是維護系統生成的表文件。列如MyISAM存儲引擎就生成frm,myd,myi文件,維護這些文件,將這個表結構的信息緩存起來,另外該模塊還管理表級別的鎖。
存儲引擎接口模塊:MySQL實現了其數據庫底層存儲引擎的插件式管理,將各類數據處理高度抽象化。
4 結果
命令執行完了以後,將結果集返回給’理解進/線程模塊’(返回的也能夠是相應標識,成功失敗)
'理解進/線程模塊’進行後續的清理工做,並繼續等待請求或斷開與客戶端的鏈接