MySQL架構(gòu)設(shè)計思想詳解
前言
很多開發(fā)同學(xué)對SQL優(yōu)化如數(shù)家珍,卻對MySQL架構(gòu)一知半解。豈不是只見樹葉,不見森林,終將陷入細節(jié)中不能自拔。
今天就一塊學(xué)習(xí)MySQL分層架構(gòu),深入了解MySQL底層實現(xiàn)原理,以及每層的作用,我們常見的SQL優(yōu)化到底在哪一層做了優(yōu)化?
1. MySQL整體架構(gòu)
由圖中可以看到MySQL架構(gòu)主要分為Server層和存儲引擎層。
Server層又分為連接器、緩存、分析器、優(yōu)化器、執(zhí)行器。所有跨存儲引擎的功能都在這層實現(xiàn),比如:函數(shù)、存儲過程、觸發(fā)器、視圖等。
存儲引擎是可插拔式的,常見的存儲引擎有MyISAM、InnoDB、Memory等,MySQL5.5之前默認的是MyISAM,之后默認的是InnoDB。
2. 連接器
連接器主要用來管理客戶端的連接和用戶身份認證。
客戶端與Server端的連接采用的是TCP協(xié)議,經(jīng)過TCP握手,建立連接之后,連接器開始進行身份驗證。
> mysql -hlocalhost -P3306 -uroot -p
如果認證失敗,就會出現(xiàn)錯誤 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)。
可以通過 show processlist 命令查看系統(tǒng)所有連接的信息:
其中Commond列表示連接狀態(tài),Daemon表示后臺進程,Query表示查詢,Sleep表示空閑連接。
3. 查詢緩存
客戶端請求不會直接去存儲引擎查詢數(shù)據(jù),而是先在緩存中查詢結(jié)果是否存在。如果結(jié)果已存在,直接返回,否則再執(zhí)行一遍查詢流程,查詢結(jié)束后把結(jié)果再緩存起來。
如果數(shù)據(jù)表發(fā)生更改,將清空失效緩存,例如 insert、update、delete、alter操作等。
對于頻繁變更的數(shù)據(jù)表來說,緩存命中率很低。使用緩存反而降低了讀寫性能,所以在MySQL8.0以后就移除了緩存模塊。
可以通過下面命令查看是否開啟了緩存:
4. 分析器
分析器主要對SQL語句進行詞法分析和語法分析。
首先進行詞法分析,分析出MySQL的關(guān)鍵字、以及每個詞語代表的含義。然后進行語法分析,檢測SQL語句是否符合MySQL語法要求。
MySQL通過識別字符串中列名、表名、where、select/update/insert 等MySQL關(guān)鍵字,在根據(jù)語法規(guī)則判斷sql是否滿足語法,最終會生成一個抽象語法樹(AST)。
比如:SQL語句中少寫個where關(guān)鍵字,就會提示錯誤。
mysql> select * from user id=1; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1' at line 1
5. 優(yōu)化器
在真正執(zhí)行SQL語句之前,還需要經(jīng)過優(yōu)化器處理。
我們熟知的執(zhí)行計劃(Explain)就是優(yōu)化器生成的。
優(yōu)化器主要有兩個作用:邏輯優(yōu)化和物理優(yōu)化。
邏輯優(yōu)化主要進行等價謂詞重寫、條件化簡、子查詢消除、連接消除、語義優(yōu)化、分組合并、選擇下推、索引優(yōu)化查詢、表查詢替換視圖查詢、Union替換or操作等。
物理優(yōu)化主要作用是通過貪婪算法,根據(jù)代價估算模型,估算出每種執(zhí)行方式的代價。并使用索引優(yōu)化表連接,最終生成查詢執(zhí)行計劃。
附上MySQL優(yōu)化器架構(gòu)圖,可以清晰的看到優(yōu)化過程:
如果想知道優(yōu)化器估算結(jié)果信息,可以通過Explain查看,關(guān)注一燈架構(gòu),下篇文章會詳細講解Explain具體用法。
6. 執(zhí)行器
在優(yōu)化器優(yōu)化完SQL,并生成了執(zhí)行計劃后,就會把執(zhí)行計劃傳遞給執(zhí)行器。
執(zhí)行器調(diào)用存儲引擎接口,真正的執(zhí)行SQL查詢。獲取到存儲引擎返回的查詢結(jié)果,并把結(jié)果返回給客戶端,至此SQL語句執(zhí)行結(jié)束。
7. 總結(jié)
本篇文章主要帶大家了解了MySQL分層架構(gòu),以及每層的架構(gòu)的作用??梢钥闯鯩ySQL每層架構(gòu)分工明確、邏輯清晰,深刻地體現(xiàn)了架構(gòu)設(shè)計中“高內(nèi)聚,低耦合”的設(shè)計思想。我們平時在做架構(gòu)設(shè)計的時候,也要多學(xué)習(xí)一下這種分層架構(gòu)的設(shè)計思想。
到此這篇關(guān)于MySQL架構(gòu)設(shè)計思想詳解的文章就介紹到這了,更多相關(guān)MySQL架構(gòu)設(shè)計內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL?數(shù)據(jù)庫?增刪查改、克隆、外鍵?等操作總結(jié)
這篇文章主要介紹了MySQL?數(shù)據(jù)庫?增刪查改、克隆、外鍵?等操作,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05安裝Mysql5.7.10 winx64出現(xiàn)的幾個問題匯總
這篇文章主要介紹了安裝Mysql5.7.10 winx64出現(xiàn)的幾個問題匯總及解決方案,非常不錯,需要的朋友可以參考下2016-08-08centos7環(huán)境下源碼安裝mysql5.7.16的方法詳解
這篇文章主要介紹了centos7環(huán)境下源碼安裝mysql5.7.16的方法,詳細分析了centos7環(huán)境下MySQL安裝的相關(guān)步驟、操作命令、配置方法與注意事項,需要的朋友可以參考下2020-02-02Mysql調(diào)優(yōu)Explain工具詳解及實戰(zhàn)演練(推薦)
這篇文章主要介紹了Mysql調(diào)優(yōu)Explain工具詳解及實戰(zhàn)演練,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03SQL?JOIN?子句合并多個表中相關(guān)行全面指南
這篇文章主要為大家介紹了SQL?JOIN?子句合并多個表中相關(guān)行全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11mysql 創(chuàng)建root用戶和普通用戶及修改刪除功能
這篇文章主要介紹了mysql 創(chuàng)建root用戶和普通用戶及修改刪除功能,需要的朋友可以參考下2017-05-05