MySQL驅(qū)動到底是什么東西
我們?nèi)绻贘ava系統(tǒng)中去訪問一個MySQL數(shù)據(jù)庫,必須得在系統(tǒng)的依賴中加入一個MySQL驅(qū)動骂租,有了這個MySQL驅(qū)動才能跟MySQL數(shù)據(jù)庫建立連接躲惰,然后執(zhí)行各種各樣的SQL語句奸焙。
他會在底層跟數(shù)據(jù)庫建立網(wǎng)絡(luò)連接嫌术,有網(wǎng)絡(luò)連接烫扼,接著才能去發(fā)送請求給數(shù)據(jù)庫服務(wù)器曙求!
MySQL數(shù)據(jù)庫的連接池是用來干什么的
多個線程并發(fā)處理多個請求的時候,都要去搶奪一個連接去訪問數(shù)據(jù)庫的話映企,那效率肯定是很低下的悟狱,所以一般我們必須要使用一個數(shù)據(jù)庫連接池,也就是說在一個池子里維持多個數(shù)據(jù)庫連接堰氓,讓多個線程使用里面的不同的數(shù)據(jù)庫連接去 執(zhí)行SQL語句挤渐,然后執(zhí)行完SQL語句之后,不要銷毀這個數(shù)據(jù)庫連接双絮,而是把連接放回池子里浴麻,后續(xù)還可以繼續(xù)使用。
基于這樣的一個數(shù)據(jù)庫連接池的機制囤攀,就可以解決多個線程并發(fā)的使用多個數(shù)據(jù)庫連接去執(zhí)行SQL語句的問題软免,而且還避免了數(shù)據(jù)庫連 接使用完之后就銷毀的問題。
實際上MySQL中的連接池就是維護了與系統(tǒng)之間的多個數(shù)據(jù)庫連接抚岗。除此之外或杠,你的系統(tǒng)每次跟MySQL建立連接的 時候,還會根據(jù)你傳遞過來的賬號和密碼宣蔚,進行賬號密碼的驗證向抢,庫表權(quán)限的驗證。
SQL接口:負責(zé)處理接收到的SQL語句
MySQL內(nèi)部首先提供了一個組件胚委,就是SQL接口(SQL Interface)挟鸠,他是一套執(zhí)行SQL語句的接口,專門用于執(zhí)行我們 發(fā)送給MySQL的那些增刪改查的SQL語句 亩冬。
因此MySQL的工作線程接收到SQL語句之后艘希,就會轉(zhuǎn)交給SQL接口去執(zhí)行。
查詢解析器:讓MySQL能看懂sql語句
這個查詢解析器(Parser)就是負責(zé)對SQL語句進行解析的硅急,所謂的SQL解析覆享,就是按照既定的SQL語法,對我們按照SQL語法規(guī)則編寫的SQL語句進行解析营袜,然后理解這個SQL語句要干什么事情撒顿。
查詢優(yōu)化器:選擇最優(yōu)的查詢路徑
當我們通過解析器理解了SQL語句要干什么之后,接著會找查詢優(yōu)化器(Optimizer)來選擇一個最優(yōu)的查詢路徑荚板。
這個看起來確實很抽象凤壁,我們可以用一個極為通俗簡單的例子吩屹,讓大家理解一下所謂的最優(yōu)查詢路徑是什么。
例如:select id,name,age from user where id=1;
直接定位到“users”表中的“id”字段等于1的一行數(shù)據(jù)拧抖,然后查出來那行數(shù)據(jù)“id,name,age”三個字段的值就可以了
先把“users”表中的每一行數(shù)據(jù)的“id,name,age”三個字段的值都查出來煤搜,然后從這批數(shù)據(jù)里過濾出來“id”字段等于1的那行數(shù)據(jù)的“id,name,age”三個字段
上面這就是一個最簡單的SQL語句的兩種實現(xiàn)路徑,其實我們會發(fā)現(xiàn)唧席,要完成這個SQL語句的目標擦盾,兩個路徑都可以做到,但是哪一種更好呢袱吆?顯然感覺上是第一種查詢路徑更好一些厌衙。
所以查詢優(yōu)化器大概就是干這個的距淫,他會針對你編寫的幾十行绞绒、幾百行甚至上千行的復(fù)雜SQL語句生成查詢路徑樹,然后從里面選擇一條最優(yōu)的查詢路徑出來榕暇。
相當于他會告訴你蓬衡,你應(yīng)該按照一個什么樣的步驟和順序,去執(zhí)行哪些操作彤枢,然后一步一步的把SQL語句就給完成了狰晚。
執(zhí)行器:根據(jù)執(zhí)行計劃調(diào)用存儲引擎的接口
執(zhí)行器就會去根據(jù)我們的優(yōu)化器生成的一套執(zhí)行計劃,然后不停的調(diào)用存儲引擎的各種接口去完成SQL 語句的執(zhí)行計劃缴啡,大致就是不停的更新或者提取一些數(shù)據(jù)出來壁晒。
調(diào)用存儲引擎接口,真正執(zhí)行SQL語句
我們已經(jīng)知道一個SQL語句要如何執(zhí)行了业栅,但是我們現(xiàn)在怎么知道哪些數(shù)據(jù)在內(nèi)存里秒咐?哪些數(shù)據(jù)在磁盤里?我們執(zhí)行的時候是更新內(nèi)存的數(shù)據(jù)碘裕?還是更新磁盤的數(shù)據(jù)携取?我們?nèi)绻麓疟P的數(shù)據(jù),是先查詢哪個磁盤文件帮孔,再更新哪個磁盤文件雷滋?
這個時候就需要存儲引擎了,存儲引擎其實就是執(zhí)行SQL語句的文兢,他會按照一定的步驟去查詢內(nèi)存緩存數(shù)據(jù)晤斩,更新磁盤數(shù)據(jù),查詢磁盤數(shù)據(jù)姆坚,等等澳泵,執(zhí)行諸如此類的一系列的操作
MySQL的架構(gòu)設(shè)計中,SQL接口旷偿、SQL解析器烹俗、查詢優(yōu)化器其實都是通用的爆侣,他就是一套組件而已。
但是存儲引擎的話幢妄,他是支持各種各樣的存儲引擎的兔仰,比如我們常見的InnoDB、MyISAM蕉鸳、Memory等等乎赴,我們是可以選擇使用哪種存儲引擎來負責(zé)具體的SQL語句執(zhí)行的。