如果能在頭腦中構(gòu)建一副MySQL各組件之間如何協(xié)同工作的架構(gòu)圖,就會有助于深入理解MySQL服務(wù)器。
最上層的服務(wù)并不是MySQL所獨(dú)有的,大多數(shù)基于網(wǎng)絡(luò)的客戶端/服務(wù)器的工具都有類似的架構(gòu)。比如連接處理、授權(quán)認(rèn)證、安全等等。
第二層架構(gòu)是MySQL比較有意思的部分。大多數(shù)MySQL的核心服務(wù)功能都在這一層,包括查詢解析、分析、優(yōu)化、緩存以及所有內(nèi)置函數(shù)(例如,日期,時(shí)間,數(shù)學(xué)和加密函數(shù)),所有跨存儲引擎的功能都在這一層實(shí)現(xiàn):存儲過程,觸發(fā)器,視圖等。
第三層包含了存儲引擎。存儲引擎負(fù)責(zé)MySQL中數(shù)據(jù)的存儲和提取。和GNU/Linux下的各種文件系統(tǒng)一樣,每個(gè)存儲引擎都有它的優(yōu)勢和劣勢。服務(wù)器通過API與存儲引擎進(jìn)行通信。這些接口屏蔽了不同存儲引擎之間的差異,使得這些差異對上層的查詢過程透明。存儲引擎API包含十幾個(gè)底層函數(shù),用于執(zhí)行諸如“開始一個(gè)事物”或者“根據(jù)主鍵提取一行記錄”等操作。但存儲引擎不會去解析SQL(注:InnoDB是一個(gè)例外,它會解析外鍵定義,因?yàn)镸ySQL服務(wù)器本身沒有實(shí)現(xiàn)該功能),不同存儲引擎之間也不會互相通信,而只是簡單地響應(yīng)上層服務(wù)器的請求。
連接管理與安全
每個(gè)客戶端連接都會在服務(wù)器進(jìn)程中擁有一個(gè)線程,這個(gè)連接的查詢只會在這個(gè)單獨(dú)的線程中執(zhí)行,該線程只能輪流在某個(gè)CPU核心或者CPU中運(yùn)行。服務(wù)器會負(fù)責(zé)緩存線程,因此不需要為每一個(gè)新建的連接創(chuàng)建或者銷毀線程。(注:MySQL5.5或者更新的版本提供的一個(gè)API,支持線程池插件,可以使用池中少量的線程來服務(wù)大量的連接)。
當(dāng)客戶端(應(yīng)用)連接到MySQL服務(wù)器時(shí),服務(wù)器需要對其進(jìn)行認(rèn)證。認(rèn)證基于用戶名,原始主機(jī)信息和密碼。如果使用了安全套接字(SSL)的方式連接,還可以使用X.509證書認(rèn)證。一旦客戶端連接成功,服務(wù)器會繼續(xù)驗(yàn)證客戶端是否具有某個(gè)特定查詢的權(quán)限(例如,是否允許客戶端對world數(shù)據(jù)庫的Country表執(zhí)行SELECT語句)。
優(yōu)化與執(zhí)行
MySQL會解析查詢,并創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)(解析樹),然后對其進(jìn)行各種優(yōu)化,包括重寫查詢,決定表的讀取順序,以及選擇合適的索引等。用戶可以通過特殊的關(guān)鍵字提示(hint)優(yōu)化器,影響它的決策過程。也可以請求優(yōu)化器解釋(explain)優(yōu)化過程的各個(gè)因素,使用戶可以知道服務(wù)器是如何進(jìn)行優(yōu)化決策的,并提供一個(gè)參考基準(zhǔn),便于用戶重構(gòu)查詢和schema,修改相關(guān)配置,是應(yīng)用盡可能高效運(yùn)行。
優(yōu)化器并不關(guān)心使用的是什么存儲引擎,但存儲引擎對于優(yōu)化查詢是有影響的。優(yōu)化器會請求存儲引擎提供容量或某個(gè)具體操作的開銷信息,以及表數(shù)據(jù)的統(tǒng)計(jì)信息等。例如,某些存儲引擎的某種索引,可能對一些特定的查詢有優(yōu)化。
對于SELECT語句,在解析查詢之前,服務(wù)器會先檢查查詢緩存(Query Cache),如果能夠在其中找到對應(yīng)的查詢,服務(wù)器就不必再執(zhí)行查詢解析、優(yōu)化和執(zhí)行的整個(gè)過程,而是直接返回查詢緩存中的結(jié)果集。
如果能在頭腦中構(gòu)建一副MySQL各組件之間如何協(xié)同工作的架構(gòu)圖,就會有助于深入理解MySQL服務(wù)器。
最上層的服務(wù)并不是MySQL所獨(dú)有的,大多數(shù)基于網(wǎng)絡(luò)的客戶端/服務(wù)器的工具都有類似的架構(gòu)。比如連接處理、授權(quán)認(rèn)證、安全等等。
第二層架構(gòu)是MySQL比較有意思的部分。大多數(shù)MySQL的核心服務(wù)功能都在這一層,包括查詢解析、分析、優(yōu)化、緩存以及所有內(nèi)置函數(shù)(例如,日期,時(shí)間,數(shù)學(xué)和加密函數(shù)),所有跨存儲引擎的功能都在這一層實(shí)現(xiàn):存儲過程,觸發(fā)器,視圖等。
第三層包含了存儲引擎。存儲引擎負(fù)責(zé)MySQL中數(shù)據(jù)的存儲和提取。和GNU/Linux下的各種文件系統(tǒng)一樣,每個(gè)存儲引擎都有它的優(yōu)勢和劣勢。服務(wù)器通過API與存儲引擎進(jìn)行通信。這些接口屏蔽了不同存儲引擎之間的差異,使得這些差異對上層的查詢過程透明。存儲引擎API包含十幾個(gè)底層函數(shù),用于執(zhí)行諸如“開始一個(gè)事物”或者“根據(jù)主鍵提取一行記錄”等操作。但存儲引擎不會去解析SQL(注:InnoDB是一個(gè)例外,它會解析外鍵定義,因?yàn)镸ySQL服務(wù)器本身沒有實(shí)現(xiàn)該功能),不同存儲引擎之間也不會互相通信,而只是簡單地響應(yīng)上層服務(wù)器的請求。
連接管理與安全
每個(gè)客戶端連接都會在服務(wù)器進(jìn)程中擁有一個(gè)線程,這個(gè)連接的查詢只會在這個(gè)單獨(dú)的線程中執(zhí)行,該線程只能輪流在某個(gè)CPU核心或者CPU中運(yùn)行。服務(wù)器會負(fù)責(zé)緩存線程,因此不需要為每一個(gè)新建的連接創(chuàng)建或者銷毀線程。(注:MySQL5.5或者更新的版本提供的一個(gè)API,支持線程池插件,可以使用池中少量的線程來服務(wù)大量的連接)。
當(dāng)客戶端(應(yīng)用)連接到MySQL服務(wù)器時(shí),服務(wù)器需要對其進(jìn)行認(rèn)證。認(rèn)證基于用戶名,原始主機(jī)信息和密碼。如果使用了安全套接字(SSL)的方式連接,還可以使用X.509證書認(rèn)證。一旦客戶端連接成功,服務(wù)器會繼續(xù)驗(yàn)證客戶端是否具有某個(gè)特定查詢的權(quán)限(例如,是否允許客戶端對world數(shù)據(jù)庫的Country表執(zhí)行SELECT語句)。
優(yōu)化與執(zhí)行
MySQL會解析查詢,并創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)(解析樹),然后對其進(jìn)行各種優(yōu)化,包括重寫查詢,決定表的讀取順序,以及選擇合適的索引等。用戶可以通過特殊的關(guān)鍵字提示(hint)優(yōu)化器,影響它的決策過程。也可以請求優(yōu)化器解釋(explain)優(yōu)化過程的各個(gè)因素,使用戶可以知道服務(wù)器是如何進(jìn)行優(yōu)化決策的,并提供一個(gè)參考基準(zhǔn),便于用戶重構(gòu)查詢和schema,修改相關(guān)配置,是應(yīng)用盡可能高效運(yùn)行。
優(yōu)化器并不關(guān)心使用的是什么存儲引擎,但存儲引擎對于優(yōu)化查詢是有影響的。優(yōu)化器會請求存儲引擎提供容量或某個(gè)具體操作的開銷信息,以及表數(shù)據(jù)的統(tǒng)計(jì)信息等。例如,某些存儲引擎的某種索引,可能對一些特定的查詢有優(yōu)化。
對于SELECT語句,在解析查詢之前,服務(wù)器會先檢查查詢緩存(Query Cache),如果能夠在其中找到對應(yīng)的查詢,服務(wù)器就不必再執(zhí)行查詢解析、優(yōu)化和執(zhí)行的整個(gè)過程,而是直接返回查詢緩存中的結(jié)果集。
?以上就是【MySQL】MySQL邏輯架構(gòu)的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!