Mysql 架構(gòu)及執(zhí)行流程

簡書不支持目錄自動錨萌腿,不過還是保留目錄方便了解大概內(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ā)行版中全部刪除捧请。

關(guān)于 mysql 8.0 對將刪除查詢緩存功能的說明

  • 存儲引擎:存儲引擎,存儲引擎是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)中,查詢緩存對性能的提高是非常顯著的简僧。

關(guān)于 mysql 8.0 對將刪除查詢緩存功能的說明

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 啟動

  1. 通過命令net start mysql(windows) / service mysql start(linux)啟動MySQL服務(wù)
  2. 調(diào)用初始模塊;初始化模塊就是在數(shù)據(jù)庫啟動的時候肖爵,對整個數(shù)據(jù)庫做的一些初始化操作,比如各種系統(tǒng)環(huán)境變量的初始化臀脏,各種緩存劝堪,存儲引擎初始化設(shè)
    置等。

3.1.2 連接

  1. 用戶發(fā)送一條SQL揉稚,這個時候會被網(wǎng)絡(luò)交互模塊監(jiān)聽到用戶的操作請求秒啦,傳遞給‘連接管理模塊’
  2. 接收到請求轉(zhuǎn)發(fā)到‘進/線程連接模塊’
  3. 調(diào)用‘用戶模塊’來進行權(quán)限檢測(訪問數(shù)據(jù)庫的權(quán)限)
  4. 通過檢測之后就會去‘連接進/線程模塊’從‘線程連接池’中查找空閑的被緩存的連接線程和客戶端請求對接,如果失敗則創(chuàng)建一個新的連接請求 7. 返回連接線程

3.1.3 處理

  1. 在用戶權(quán)限校驗成功之后窃植,并且獲得新的連接池之后就會去‘命令分發(fā)器’帝蒿,判斷命令的類型如果是select就會去訪問‘查詢緩存’荐糜,如果沒有就會往下執(zhí)行;
  2. 如果是select巷怜,并且開啟'查詢緩存'之后就會去緩存中查詢是否有與之相匹配的SQL,如果有就會校驗用戶訪問該數(shù)據(jù)的權(quán)限,通過就返回不通過就會返回錯誤信
    息. 如果數(shù)據(jù)沒有就會往下執(zhí)行
  3. 會記錄過程中的SQL操作過程到日志文件中
  4. 在第8,9步 沒有滿足相應(yīng)條件之后往下執(zhí)行進入 '命令解析器',經(jīng)過詞法分析,語法分析后生成解析樹
  5. 根據(jù)操作轉(zhuǎn)到對應(yīng)的模塊處理(預(yù)處理階段)葛超,根據(jù)SQL選擇執(zhí)行的模塊
  6. 模塊收到請求后,通過'訪問控制模塊'檢查所連接的用戶是否有訪問目標表和目標字段的權(quán)限(是指訪問這些數(shù)據(jù)的權(quán)限)
  7. 有權(quán)限'表管理模塊'先查看table cache中是否存在延塑,有則直接對應(yīng)的表和獲取鎖绣张,負責(zé)重新打開表文件
  8. 根據(jù)表的ENGINE數(shù)據(jù),獲取表的存儲引擎類型等信息
  9. 通過接口調(diào)用對應(yīng)的存儲引擎處理
  10. 返回查詢之后數(shù)據(jù)內(nèi)容

3.1.4 結(jié)果

  1. 命令執(zhí)行完了之后关带,將結(jié)果集返回給'連接進/線程模塊'(返回的也可以是相應(yīng)標識侥涵,成功失敗)
  2. '連接進/線程模塊'進行后續(xù)的清理工作,并繼續(xù)等待請求或斷開與客戶端的連接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宋雏,一起剝皮案震驚了整個濱河市芜飘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磨总,老刑警劉巖嗦明,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚪燕,居然都是意外死亡娶牌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門馆纳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诗良,“玉大人,你說我怎么就攤上這事鲁驶〖” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵钥弯,是天一觀的道長壹罚。 經(jīng)常有香客問我,道長寿羞,這世上最難降的妖魔是什么猖凛? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮绪穆,結(jié)果婚禮上辨泳,老公的妹妹穿的比我還像新娘。我一直安慰自己玖院,他們只是感情好菠红,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著难菌,像睡著了一般围段。 火紅的嫁衣襯著肌膚如雪精盅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天钥勋,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹄咖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼付鹿,長吁一口氣:“原來是場噩夢啊……” “哼澜汤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舵匾,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤俊抵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坐梯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體务蝠,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年烛缔,在試婚紗的時候發(fā)現(xiàn)自己被綠了馏段。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡践瓷,死狀恐怖院喜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晕翠,我是刑警寧澤喷舀,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站淋肾,受9級特大地震影響硫麻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜樊卓,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一拿愧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碌尔,春花似錦浇辜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叹坦,卻和暖如春熊镣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工绪囱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留测蹲,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓毕箍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親道盏。 傳聞我的和親對象是個殘疾皇子而柑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容