一文搞懂MySQL運(yùn)行機(jī)制原理
前言
前文我們了解了MySQL采用客戶端/服務(wù)器架構(gòu),用戶通過(guò)客戶端程序發(fā)送增刪改查需求,服務(wù)器程序收到請(qǐng)求后處理,并且把處理結(jié)果返回給客戶端。這篇文章主要看下MySQL服務(wù)端是如何處理客戶端的請(qǐng)求,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
MySQL服務(wù)器體系架構(gòu)
MySQL Server架構(gòu)自頂向下大致可以分網(wǎng)絡(luò)連接層、服務(wù)層、存儲(chǔ)引擎層和系統(tǒng)文件層。
網(wǎng)絡(luò)連接層
客戶端連接器:提供與MySQL服務(wù)器建立的支持。
服務(wù)層
主要包含系統(tǒng)管理和控制工具、連接池、SQL接口、解析器、查詢優(yōu)化器和緩存六個(gè)部分。
- 1) 連接池:存儲(chǔ)和管理客戶端與數(shù)據(jù)庫(kù)的連接。
- 2) 系統(tǒng)管理和控制工具:集群、備份、安全管理。
- 3) SQL接口:接受客戶端發(fā)送的各種SQL命令并返回查詢結(jié)果。
- 4) 解析器:解析SQL,生成一顆解析樹(shù),驗(yàn)證SQL是否合法。
- 5) 查詢優(yōu)化器:將解析樹(shù)轉(zhuǎn)化成執(zhí)行計(jì)劃,與存儲(chǔ)引擎進(jìn)行交互。
- 6) 緩存:各種緩存,比如表、記錄、權(quán)限等等,緩存有命中查詢結(jié)果直接返回。
存儲(chǔ)引擎層
負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)與提取,與底層系統(tǒng)文件進(jìn)行交互,可插拔,常見(jiàn)的兩類:MyISAM和InnoDB。
系統(tǒng)文件層
負(fù)責(zé)將數(shù)據(jù)庫(kù)的數(shù)據(jù)和日志存儲(chǔ)在文件系統(tǒng)之上,并完成與存儲(chǔ)引擎的交互,比如日志、配置文件等等。
服務(wù)器處理客戶端請(qǐng)求
客戶端可以向服務(wù)器發(fā)送增刪改查等各類請(qǐng)求,我們來(lái)看一下服務(wù)器是如何處理客戶端發(fā)送的請(qǐng)求。
連接管理
客戶端與服務(wù)器進(jìn)程建立連接,每當(dāng)有一個(gè)客戶端進(jìn)程連接到服務(wù)器進(jìn)程時(shí),服務(wù)器進(jìn)程都會(huì)創(chuàng)建一個(gè)線程來(lái)專門(mén)處理與這個(gè)客戶端的交互,當(dāng)該客戶端退出時(shí)會(huì)與服務(wù)器斷開(kāi)連接,服務(wù)器會(huì)把線程緩存起來(lái)。
解析與優(yōu)化
查詢緩存
如果兩個(gè)查詢請(qǐng)求在任何字符上的不同都會(huì)導(dǎo)致緩存不命中。請(qǐng)求中包含某些系統(tǒng)函數(shù)、用戶自定義變量和函數(shù)、一些系統(tǒng)表也不會(huì)被緩存。
只要該表的結(jié)構(gòu)或者數(shù)據(jù)被修改,則該表的所有高速緩存查詢都將無(wú)效并刪除。
PS:8.0中查詢緩存已經(jīng)刪除了
語(yǔ)法解析
如果查詢緩存沒(méi)有命中,就進(jìn)入查詢階段,服務(wù)器先對(duì)文本做分析,判斷語(yǔ)法是否正確,然后從文本中將要查詢的表、各種查詢條件都提取出來(lái)放到內(nèi)部使用的一些數(shù)據(jù)結(jié)構(gòu)上。
算是一個(gè)編譯過(guò)程,涉及詞法解析、語(yǔ)法分析、語(yǔ)義分析等階段。
查詢優(yōu)化
對(duì)SQL做優(yōu)化,生成一個(gè)執(zhí)行計(jì)劃,表明了應(yīng)該使用哪些索引進(jìn)行查詢,表之間的連接順序是怎樣的。
我們可以使用Explain來(lái)查看某個(gè)語(yǔ)句的執(zhí)行計(jì)劃。
存儲(chǔ)引擎
完成查詢優(yōu)化之后還沒(méi)有真正去訪問(wèn)真實(shí)的數(shù)據(jù)表,數(shù)據(jù)的存儲(chǔ)和提取操作都封裝到了這個(gè)模塊里。不同存儲(chǔ)引擎管理的表具體的存儲(chǔ)結(jié)構(gòu)可能不同,采用存取算法也可能不同。
小結(jié)
MySQL Server架構(gòu)自頂向下大致可以分網(wǎng)絡(luò)連接層、服務(wù)層、存儲(chǔ)引擎層和系統(tǒng)文件層。mysql執(zhí)行查詢的過(guò)程如下:
- 客戶端先發(fā)送查詢語(yǔ)句給服務(wù)器
- 服務(wù)器檢查緩存,如果存在則返回
- 進(jìn)行sql解析,生成解析樹(shù),再預(yù)處理,生成第二個(gè)解析樹(shù),最后再經(jīng)過(guò)優(yōu)化器,生成真正的執(zhí)行計(jì)劃
- 根據(jù)執(zhí)行計(jì)劃,調(diào)用存儲(chǔ)引擎的API來(lái)執(zhí)行查詢
- 將結(jié)果返回給客戶端。
到此這篇關(guān)于一文搞懂MySQL運(yùn)行機(jī)制原理的文章就介紹到這了,更多相關(guān)MySQL運(yùn)行機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- win2008 r2 服務(wù)器php+mysql+sqlserver2008運(yùn)行環(huán)境配置(從安裝、優(yōu)化、安全等)
- mysql運(yùn)行net start mysql報(bào)服務(wù)名無(wú)效的解決辦法
- Docker創(chuàng)建運(yùn)行多個(gè)mysql容器的方法示例
- 使用 docker-compose 運(yùn)行 MySQL的方法
- MySQL MHA 運(yùn)行狀態(tài)監(jiān)控介紹
- Docker中優(yōu)化Mysql運(yùn)行內(nèi)存的操作
- MySQL運(yùn)行報(bào)錯(cuò):“Expression?#1?of?SELECT?list?is?not?in?GROUP?BY?clause?and?contains?nonaggre”解決方法
相關(guān)文章
MYSQL開(kāi)發(fā)性能研究之批量插入數(shù)據(jù)的優(yōu)化方法
在網(wǎng)上也看到過(guò)另外的幾種方法,比如說(shuō)預(yù)處理SQL,比如說(shuō)批量提交。那么這些方法的性能到底如何?本文就會(huì)對(duì)這些方法做一個(gè)比較2017-07-07MySQL分庫(kù)分表后路由策略設(shè)計(jì)詳情
這篇文章主要介紹了MySQL分庫(kù)分表后路由策略設(shè)計(jì)詳情,分庫(kù)分表后設(shè)計(jì)到的第一個(gè)問(wèn)題就是,如何選擇路由key,應(yīng)該如何對(duì)key進(jìn)行路由2022-08-08在SQL中獲取一個(gè)長(zhǎng)字符串中某個(gè)字符串出現(xiàn)次數(shù)的實(shí)現(xiàn)方法
以下是對(duì)在SQL中獲取一個(gè)長(zhǎng)字符串中某個(gè)字符串出現(xiàn)次數(shù)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07mysql數(shù)據(jù)庫(kù)太大了如何備份與還原
今天小編就為大家分享一篇關(guān)于mysql數(shù)據(jù)庫(kù)太大了如何備份與還原,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03mysql數(shù)據(jù)庫(kù)查詢優(yōu)化 mysql效率
MySQL由于它本身的小巧和操作的高效, 在數(shù)據(jù)庫(kù)應(yīng)用中越來(lái)越多的被采用.我在開(kāi)發(fā)一個(gè)P2P應(yīng)用的時(shí)候曾經(jīng)使用MySQL來(lái)保存P2P節(jié)點(diǎn),由于P2P的應(yīng)用中,結(jié)點(diǎn)數(shù)動(dòng)輒上萬(wàn)個(gè),而且節(jié)點(diǎn)變化頻繁,因此一定要保持查詢和插入的高效.以下是我在使用過(guò)程中做的提高效率的三個(gè)有效的嘗試. 1. 使用statement進(jìn)行綁定查詢 2. 隨機(jī)的獲取記錄 3. 使用連接池管理連接.2008-01-01