簡書不支持目錄自動錨萌腿,不過還是保留目錄方便了解大概內(nèi)容了
Mysql 架構(gòu)及執(zhí)行流程(20200405_20200405)
1. mysql 架構(gòu)
1.1 簡化版架構(gòu)
客戶端+ 核心服務(wù) + 存儲引擎
?? ??(客戶端)????
=====【連接/線程處理】====}
?? ??
【查詢緩存】 ?? 【解析器】 } 【核心服務(wù)】
??
========【優(yōu)化器】=======}
????
=======【存儲引擎】=======
1.2 詳細版架構(gòu)
MySql 邏輯架構(gòu)圖
|--------------------------------------------|
| 客戶端 |
| 「Connectors: PHP昌跌、JDBC拄丰、Python、navicat」 |
|--------------------------------------------|
?? ??
|============Mysql 服務(wù)端=================================================================|
|-----------------------------|
| Connection Pool |
|-----------------------------|
| -------------------| | ------------ || ---------- | |----------- | | ----------- |
| | | 【SQL 接口】 || 【解析器】 | |【優(yōu)化器】 | |【查詢緩存】 |
| | | ------------ || ---------- | |----------- | | ----------- |
| 系統(tǒng)管理和控制工具 |
| | |------------------------------|
| | | 【插件式存儲引擎】 |
| | | MyISAM雀哨、InnoDB固该、Archive...」 |
| -------------------| |------------------------------|
|-----------------------------------------------------------------------------------------|
| 【文件系統(tǒng)】 【文件 && 日志】 |
| 「NTFS、ufs辐董、ext2/3、NFS弓候、SAN、NAS」 「重做日志, 回滾日志, 數(shù)據(jù), 索引, 二進制日志...」 |
|-----------------------------------------------------------------------------------------|
|=========================================================================================|
1).最上層:最上層是一些客戶端和連接服務(wù)他匪,包含本地的 socket 通信和大多數(shù)基于客戶端/服務(wù)端工具實現(xiàn)的類似于 tcp/ip 的通信菇存,主要完成一些類似于連接處理、 授權(quán)認證及相關(guān)的安全方案邦蜜,在該層上引用了線程池的概念依鸥,為通過認證安全接入的客戶端提供線程。同樣在該層上可以實現(xiàn)基于 ssl 的安全鏈接悼沈。服務(wù) 器也會為安全接入的每個客戶端驗證它所具有的操作權(quán)限贱迟。
2).第二層: 第二層架構(gòu)主要完成大多數(shù)的核心服務(wù)功能。如 sql 接口絮供,并完成緩存的查詢衣吠。sql 的分析和優(yōu)化以及部分內(nèi)置函數(shù)的執(zhí)行。所有跨存儲引擎的功能也 在這一層實現(xiàn)壤靶,如過程缚俏,函數(shù)等。在該層,服務(wù)器會解析查詢并創(chuàng)建相應(yīng)的內(nèi)部解析樹忧换,并對其完成相應(yīng)的優(yōu)化如確定查詢表的順序恬惯,是否利用索引等。 最后生成相應(yīng)的執(zhí)行操作亚茬。如 select 語句酪耳,服務(wù)器還會查詢內(nèi)部的緩存。如果緩存空間足夠大刹缝,這樣就解決大量讀操作的環(huán)境中能夠很好的提升系統(tǒng)的性能碗暗。
3).存儲引擎層: 存儲引擎真正的負責(zé) MySQL 中數(shù)據(jù)的存儲和提取,服務(wù)器通過 API 與存儲引擎進行通信赞草,不同的存儲引擎具有的功能不同讹堤,這樣我們可以根據(jù)自己的實際需進行選取。
4).數(shù)據(jù)存儲層: 主要是將數(shù)據(jù)存儲在運行于裸設(shè)備的文件系統(tǒng)之上厨疙,并完成于存儲引擎的交互洲守。
具體內(nèi)容:
- 客戶端:支持不同語言與SQL交互。
- 系統(tǒng)管理和控制工具:配置沾凄、備份梗醇、主從、集群等
- Connection Pool:連接池撒蟀,管理緩沖用戶連接叙谨,線程處理所需要的緩存。
- SQL 接口:接受用戶的SQL命令保屯,返回用戶查詢結(jié)果手负,比如 select from 就是調(diào)用 sql interface
- 解析器:解釋器 ,SQL命令傳遞到解釋器的時候會被解釋器驗證和解析,解釋器由Lex和YACC實現(xiàn)(一個很長的腳本)姑尺,主要功能竟终,將SQL語句分解成數(shù)據(jù)結(jié)構(gòu), 并將這個結(jié)構(gòu)傳遞到后續(xù)步驟切蟋,以后的SQL語句的傳遞和處理都是基于這個結(jié)構(gòu)统捶,如果在分解構(gòu)成中遇到錯誤,說明這個sql語句是不合理的
- 優(yōu)化器:查詢優(yōu)化器柄粹,SQL語句在查詢之前會使用查詢優(yōu)化器對查詢進行優(yōu)化喘鸟,他使用的是“選取-投影-連接”進行查詢,用一個例子就可以理解:select uid,name from user where gender =1;這個 select 查詢先根據(jù)where語句進行選取驻右,而不是先將表全部查詢出來以后再進行g(shù)ender過濾什黑,這個 select 查詢先根據(jù)uid和name進行屬性投影,而不是將屬性全部取出以后再進行過濾堪夭,將這2個查詢條件連接起來生成最終查詢結(jié)果兑凿。
- Cache 和 Buffer 查詢緩存:這個查詢緩存有命中的查詢結(jié)果凯力,查詢語句就可以直接去查詢緩存中取數(shù)據(jù),這個緩存機制由一系列小緩存組成礼华,比如表緩存咐鹤,記錄緩存,key緩 存圣絮,權(quán)限緩存祈惶。查詢緩存在當(dāng)前 8.0 的版本中已經(jīng)把大部分緩存屬性去除,考慮產(chǎn)生的問題比產(chǎn)生的問題多扮匠,并將在將來的MySQL發(fā)行版中全部刪除捧请。
- 存儲引擎:存儲引擎,存儲引擎是MySql和文件打交道的具體子系統(tǒng)棒搜,MySQL的存儲引擎是插件式的疹蛉,它根據(jù)MySql AB公司提供的文件訪問層的一個抽象接口來定 制一種文件訪問機制(這個訪問機制就叫做存儲引擎),一個庫中不同表使用不同的存儲引擎也是允許的力麸。
2. mysql各個邏輯塊簡介
2.1 初始化模塊
初始化模塊就是在數(shù)據(jù)庫啟動的時候可款,對整個數(shù)據(jù)庫做的一些初始化操作,例如:各種系統(tǒng)環(huán)境變量的初始化克蚂,各種緩存闺鲸,存儲引擎初始化設(shè)置等。
2.2 核心 API
MySQL數(shù)據(jù)庫核心API主要實現(xiàn)了數(shù)據(jù)庫底層操作的優(yōu)化功能埃叭,其中主要包括IO操作摸恍、格式化輸出、高性能存儲數(shù)據(jù)結(jié)果算法的優(yōu)化赤屋,字符串的處理立镶,其中最重
要的是內(nèi)存管理。
2.3 網(wǎng)絡(luò)交互模塊
MySQL 底層網(wǎng)絡(luò)交互的模塊抽象出接口类早,對外提供可以接收和發(fā)送數(shù)據(jù)的 API 接口媚媒,對內(nèi)其他模塊需要交互的時候,同樣可以通過 API 接口調(diào)用莺奔。
2.4 服務(wù)器客戶端交互協(xié)議模塊
mysql服務(wù)器采用C/S的形式訪問數(shù)據(jù)庫欣范,數(shù)據(jù)連接使用MySQL C/S交互協(xié)議模塊变泄,實現(xiàn)了客戶端與服務(wù)器端交互過程中所需要的一些獨特的協(xié)議令哟,這些協(xié)議都是 建立在現(xiàn)有的網(wǎng)絡(luò)協(xié)議之上。
2.5 用戶模塊
用戶模塊主要功能是用于控制用戶登錄連接的權(quán)限和用戶的授權(quán)管理
2.6 訪問控制器模塊
訪問控制模塊主要用于監(jiān)控用戶的每一個操作妨蛹。訪問控制模塊實現(xiàn)的功能就是根據(jù)用戶模塊中不同的用戶授權(quán)屏富,以及根據(jù)其數(shù)據(jù)庫的各種約束來控制用戶對數(shù)據(jù) 的訪問。用戶模塊和訪問控制模塊結(jié)合起來蛙卤,就組成了MySQL數(shù)據(jù)庫的權(quán)限管理功能狠半。
2.7 連接管理噩死,連接線程與線程管理
連接管理模塊負責(zé)監(jiān)聽MySQLServer的各種請求,根據(jù)不同的請求神年,然后轉(zhuǎn)發(fā)到線程管理模塊已维,每個客戶請求都會被數(shù)據(jù)庫自動分配一個獨立的線程為其單獨服 務(wù),而連接線程的主要工作就是負責(zé)MySQL Server與客戶端通信已日,線程管理模塊負責(zé)管理這些生成的線程垛耳。
-- 查詢當(dāng)前連接: 后臺連接、查詢連接飘千、睡眠連接
show processlist;
-- 查詢最大連接
show variables like "%max_connections%";
2.8 轉(zhuǎn)發(fā)模塊
客戶端連接MySQL之后會發(fā)送一些查詢語句堂鲜, 在MySQL Server里面,連接線程接收到客戶端的一個請求后护奈,會直接將查詢轉(zhuǎn)發(fā)到各個對應(yīng)的處理模塊缔莲。轉(zhuǎn)發(fā)模 塊主要就是根據(jù)查詢語句語法分析,然后轉(zhuǎn)發(fā)給不同的模塊處理霉旗。
2.9 緩存模塊
查詢緩存模塊主要功能是將客戶端查詢的請求返回的結(jié)果集到緩存中痴奏,與查詢的一個HASH值對應(yīng)。在查詢的基表發(fā)生任何數(shù)據(jù)變化后奖慌,MySQL會自動將其查詢 的緩存失效抛虫。在讀寫比例非常高的應(yīng)用系統(tǒng)中,查詢緩存對性能的提高是非常顯著的简僧。
2.10 解析器模塊
如果沒有命中緩存建椰,解析器通過「詞法分析器」將會對 sql 開始解析,會把 sql 解析成令牌(即 token:把 sql 每一個關(guān)鍵字和數(shù)據(jù)切割為有意義的標識), 然后通過「語法分析器」將得到的令牌根據(jù) sql 中不同的關(guān)鍵字并利用相應(yīng)的轉(zhuǎn)換方法轉(zhuǎn)換成對應(yīng)的解析數(shù)據(jù)結(jié)構(gòu)(即:解析樹岛马,或者叫抽象語法數(shù))棉姐。主要是 where 條件。
sql: select * from student where id < 10 and status = 1;
詞法分析得到結(jié)果為:select, *, from, student, where, id, <, 10, and, status, =, 1
語法分析得到的結(jié)果為:實際上就是得到了一個二叉樹啦逆,利用前序遍歷即可得到完整的 where 條件
where
/
and
/ \
< =
/ \ / \
id 10 status 1
2.11 優(yōu)化器模塊
這個模塊主要是將客戶端發(fā)送的查詢請求伞矩,在之前算法的基礎(chǔ)上分析,計算出一個最優(yōu)的查詢策略(統(tǒng)計表信息夏志,取消無效條件「where 中的 1 = 1乃坤。不過 1 = 1 的作用是方便業(yè)務(wù)端拼接 sql」,判斷是否利用索引)沟蔑,優(yōu)化之后會提高查詢訪問的速度湿诊,最后根據(jù)其最優(yōu)策略返回查詢語句。
2.12 表變更管理模塊
表變更管理模塊主要負責(zé)完成DML和DDL的查詢瘦材,例如厅须,insert, update, delete, create table, alter table等語句的處理。
2.13 表維護模塊
表維護模塊主要用于檢測表的狀態(tài)食棕,分析朗和、優(yōu)化表結(jié)構(gòu)错沽,以及修復(fù)表。
2.14 系統(tǒng)狀態(tài)管理模塊
在客戶端請求系統(tǒng)狀態(tài)的時候眶拉,系統(tǒng)狀態(tài)模塊主要負責(zé)將各種狀態(tài)的數(shù)據(jù)返回給用戶千埃。最常用的一些查詢狀態(tài)的命令包括show status, show variables等,都是通 過這個模塊負責(zé)返回的忆植。
2.15 表管理器模塊
表管理器主要就是維護系統(tǒng)生成的表文件镰禾。例如,MyISAM 存儲引擎類型表生成的是 frm 文件唱逢、MYD 文件以及 MYI 文件吴侦,表管理器的工作就是維護這些文件,將各個表結(jié)構(gòu)的信息緩存起來坞古,另外該模塊還管理表級別的鎖备韧。
2.16 日志記錄模塊
日志記錄模塊主要負責(zé)整個數(shù)據(jù)庫邏輯層的日志文件,其中包含重做日志痪枫,回滾日志织堂,錯誤日志,二進制日志奶陈,以及慢查詢?nèi)罩镜取?/p>
2.17 復(fù)制模塊
復(fù)制模塊分為Master 模塊和Slave 模塊兩部分易阳。Master 模塊主要負責(zé)復(fù)制環(huán)境中讀取Master端的binary日志,以及Slave端的I/O線程交互等工作吃粒。Slave 模塊主要 有兩個線程潦俺,一個負責(zé)從Master請求和接收binay日志,并寫入本地I/O線程:另一個從relay log讀取日志事件徐勃,然后解析成可以在Save端執(zhí)行的命令事示,然后交給 Slave端的SOL線程
2.18 存儲引擎接口模塊
MySQL實現(xiàn)了其數(shù)據(jù)庫底層存儲引學(xué)的插件式管理,將各種數(shù)據(jù)處理高度抽象化僻肖。
3. mysql 的執(zhí)行流程
3.1.1 啟動
- 通過命令net start mysql(windows) / service mysql start(linux)啟動MySQL服務(wù)
- 調(diào)用初始模塊;初始化模塊就是在數(shù)據(jù)庫啟動的時候肖爵,對整個數(shù)據(jù)庫做的一些初始化操作,比如各種系統(tǒng)環(huán)境變量的初始化臀脏,各種緩存劝堪,存儲引擎初始化設(shè)
置等。
3.1.2 連接
- 用戶發(fā)送一條SQL揉稚,這個時候會被網(wǎng)絡(luò)交互模塊監(jiān)聽到用戶的操作請求秒啦,傳遞給‘連接管理模塊’
- 接收到請求轉(zhuǎn)發(fā)到‘進/線程連接模塊’
- 調(diào)用‘用戶模塊’來進行權(quán)限檢測(訪問數(shù)據(jù)庫的權(quán)限)
- 通過檢測之后就會去‘連接進/線程模塊’從‘線程連接池’中查找空閑的被緩存的連接線程和客戶端請求對接,如果失敗則創(chuàng)建一個新的連接請求 7. 返回連接線程
3.1.3 處理
- 在用戶權(quán)限校驗成功之后窃植,并且獲得新的連接池之后就會去‘命令分發(fā)器’帝蒿,判斷命令的類型如果是select就會去訪問‘查詢緩存’荐糜,如果沒有就會往下執(zhí)行;
- 如果是select巷怜,并且開啟'查詢緩存'之后就會去緩存中查詢是否有與之相匹配的SQL,如果有就會校驗用戶訪問該數(shù)據(jù)的權(quán)限,通過就返回不通過就會返回錯誤信
息. 如果數(shù)據(jù)沒有就會往下執(zhí)行 - 會記錄過程中的SQL操作過程到日志文件中
- 在第8,9步 沒有滿足相應(yīng)條件之后往下執(zhí)行進入 '命令解析器',經(jīng)過詞法分析,語法分析后生成解析樹
- 根據(jù)操作轉(zhuǎn)到對應(yīng)的模塊處理(預(yù)處理階段)葛超,根據(jù)SQL選擇執(zhí)行的模塊
- 模塊收到請求后,通過'訪問控制模塊'檢查所連接的用戶是否有訪問目標表和目標字段的權(quán)限(是指訪問這些數(shù)據(jù)的權(quán)限)
- 有權(quán)限'表管理模塊'先查看table cache中是否存在延塑,有則直接對應(yīng)的表和獲取鎖绣张,負責(zé)重新打開表文件
- 根據(jù)表的ENGINE數(shù)據(jù),獲取表的存儲引擎類型等信息
- 通過接口調(diào)用對應(yīng)的存儲引擎處理
- 返回查詢之后數(shù)據(jù)內(nèi)容
3.1.4 結(jié)果
- 命令執(zhí)行完了之后关带,將結(jié)果集返回給'連接進/線程模塊'(返回的也可以是相應(yīng)標識侥涵,成功失敗)
- '連接進/線程模塊'進行后續(xù)的清理工作,并繼續(xù)等待請求或斷開與客戶端的連接