下文主要給大家?guī)硎裁词荕ySQL的整體架構(gòu),希望這些內(nèi)容能夠帶給大家實(shí)際用處,這也是我編輯什么是MySQL的整體架構(gòu)這篇文章的主要目的。好了,廢話不多說,大家直接看下文吧。
成都創(chuàng)新互聯(lián)成立于2013年,先為那曲等服務(wù)建站,那曲等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為那曲企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
我們先看一下MySQL的架構(gòu)圖,對(duì)其先有一個(gè)整體的了解。MySQL主要分為四層架構(gòu),分別是網(wǎng)絡(luò)連接層,服務(wù)層,存儲(chǔ)引擎層,物理層。我們平常寫的SQL語句,以及對(duì)SQL語句的優(yōu)化都在服務(wù)層,他其實(shí)就是遵循一定的原則使得SQL語句能夠按我們的預(yù)期效果執(zhí)行。
主要負(fù)責(zé)連接管理,授權(quán)認(rèn)證,安全等。每個(gè)客戶端連接都對(duì)應(yīng)著云服務(wù)器上的一個(gè)線程。云服務(wù)器上維護(hù)一個(gè)線程池,避免為每個(gè)連接創(chuàng)建和銷毀線程。當(dāng)客戶端連接到MySQL云服務(wù)器時(shí),云服務(wù)器對(duì)其進(jìn)行認(rèn)證??梢酝ㄟ^用戶名與密碼認(rèn)證,也可以通過ssl證書進(jìn)行認(rèn)證。登錄認(rèn)證后,云服務(wù)器還會(huì)驗(yàn)證客戶端是否有執(zhí)行某個(gè)查詢的操作權(quán)限。這一層并不是MySQL所特有的技術(shù)。
該層是MySQL的核心,包括查詢緩存,解析器,解析樹,預(yù)處理器,查詢優(yōu)化器。
查詢緩存
在正式查詢之前,云服務(wù)器會(huì)檢查查詢緩存,如果能找到對(duì)應(yīng)的查詢,則不必進(jìn)行查詢解析,優(yōu)化,執(zhí)行等過程,直接返回緩存中的結(jié)果集。
解析器和預(yù)處理器
MySQL的解析器會(huì)根據(jù)查詢語句,構(gòu)造出一個(gè)解析樹,主要用于根據(jù)語法規(guī)則來驗(yàn)證語句是否正確,比如SQL的關(guān)鍵字是否正確,關(guān)鍵字的順序是否正確。
而預(yù)處理器主要是進(jìn)一步校驗(yàn),比如表名,字段名是否正確等。
查詢優(yōu)化器
查詢優(yōu)化器將解析樹轉(zhuǎn)化為查詢計(jì)劃,一般情況下,一條查詢可以有很多種執(zhí)行方式,最終返回相同的結(jié)果,優(yōu)化器就是找到這其中最優(yōu)的執(zhí)行計(jì)劃
執(zhí)行計(jì)劃
在完成解析和優(yōu)化階段后,MySQL根據(jù)相應(yīng)的執(zhí)行計(jì)劃去調(diào)用存儲(chǔ)引擎層提供的相應(yīng)接口來獲取結(jié)果。
負(fù)責(zé)MySQL數(shù)據(jù)的存儲(chǔ)和提取,是通過提供一系列的接口來屏蔽不同引擎之間的差異。
注意:存儲(chǔ)引擎是針對(duì)表的,而不是針對(duì)庫。也就是說同一個(gè)庫里面的不同表可以擁有不同的存儲(chǔ)引擎。
常見的存儲(chǔ)引擎有兩種,MyISAM和InnoDB,下面我們來看下他們的區(qū)別。
首先,我們先創(chuàng)建一個(gè)存儲(chǔ)引擎為MyISAM的test1表。
create table test1( a INTEGER, b varchar(10) )ENGINE=MyISAM;
我們可以去MySQL的相關(guān)目錄看一下他實(shí)際存儲(chǔ)的內(nèi)容,發(fā)現(xiàn)他對(duì)應(yīng)著三個(gè)文件。
其次,我們?cè)賱?chuàng)建一個(gè)存儲(chǔ)引擎為InnoDB的test2表。
create table test2( a INTEGER, b varchar(10) )ENGINE=INNODB;
我們?cè)偃タ匆幌滤麑?shí)際存儲(chǔ)的內(nèi)容,發(fā)現(xiàn)他對(duì)應(yīng)這一個(gè)文件。
那么問題就來了,他的數(shù)據(jù)文件和索引文件存放在哪里啦。這邊先留個(gè)問題,下下篇"文件"再說。
將數(shù)據(jù)存放在硬盤上。
我們發(fā)送一條SQL語句,其在MySQL中的整體流程究竟是什么樣的?
用戶先通過Navicat等客戶端與服務(wù)端建立連接,這邊需要用戶名和密碼進(jìn)行認(rèn)證,也可以用SSL證書進(jìn)行認(rèn)證。
登錄成功后,MySQL會(huì)根據(jù)相應(yīng)權(quán)限來判斷該角色是否擁有一些表的權(quán)限等。
如果擁有相關(guān)權(quán)限,當(dāng)用戶發(fā)送一條查詢select語句時(shí),MySQL先查詢緩存,如果已經(jīng)有這條語句的緩存,則直接返回,如果沒有則執(zhí)行下面的流程。如果是更新update,新增insert,刪除delete則不查詢緩存,直接執(zhí)行下面的流程。
MySQL會(huì)將SQL語句解析為樹,然后對(duì)其進(jìn)行校驗(yàn),比如關(guān)鍵字是否正確,關(guān)鍵字順序是否正確,表名是否正確,字段是否正確等。如果認(rèn)證沒有成功,則直接返回錯(cuò)誤。如果認(rèn)證成功了,則直接下面流程。
MySQL對(duì)解析樹進(jìn)行查詢優(yōu)化,因?yàn)槎鄠€(gè)SQL可能表達(dá)的意思一樣,但是消耗的時(shí)間可能差別很大。所以MySQL對(duì)針對(duì)表的存儲(chǔ)引擎找到最優(yōu)的語句執(zhí)行,也就是生成相應(yīng)的執(zhí)行計(jì)劃。
使用上面生成的執(zhí)行計(jì)劃,來調(diào)用存儲(chǔ)引擎層的接口。也就是我們平時(shí)使用的explain,其可以用來查看是否走索引,消耗的時(shí)間等信息。
不同的存儲(chǔ)引擎會(huì)到相應(yīng)的物理存儲(chǔ)位置,找到相應(yīng)的數(shù)據(jù),封裝并返回結(jié)果。
如果拿到了結(jié)果集,并且為select語句,MySQL會(huì)將結(jié)果放入到緩存中,避免下次再進(jìn)行相同的操作而造成資源的消耗,同時(shí)返回給客戶端結(jié)果,至此,一條SQL語句的執(zhí)行過程結(jié)束啦。
對(duì)于以上關(guān)于什么是MySQL的整體架構(gòu),大家是不是覺得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。