一條SQL查詢語(yǔ)句是如何執(zhí)行的?
-
mysql 的基礎(chǔ)架構(gòu)示意圖如下所示:
客戶端----->服務(wù)層------->存儲(chǔ)層
服務(wù)層包括連接器,查詢緩存,分析器,優(yōu)化器,執(zhí)行器,以及所有的內(nèi)置函數(shù)存儲(chǔ)引擎則負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提取,存儲(chǔ)引擎又分myisam, innodb等等, 所有種類的存儲(chǔ)引擎共用同一個(gè)服務(wù)層mysql5.55后默認(rèn)存儲(chǔ)引擎為innodb連接器分為長(zhǎng)連接和短連接,由于連接過(guò)程比較復(fù)雜,建議盡量使用長(zhǎng)連接,同時(shí)使用長(zhǎng)連接后,數(shù)據(jù)庫(kù)所占用的內(nèi)存會(huì)持續(xù)增加很可能導(dǎo)致mysql異常重啟,所以需要定期斷開(kāi)長(zhǎng)連接,或者監(jiān)聽(tīng)執(zhí)行占用較大內(nèi)存的查詢,查詢后斷開(kāi)連接進(jìn)行重連
不建議開(kāi)啟查詢緩存,因?yàn)槿魏我粋€(gè)表的更新操作都會(huì)清空該表相關(guān)的所有緩存,效率極低,除非針對(duì)的是靜態(tài)表或者更新操作極小的表,在mysql8后就不存在查詢緩存此功能了
分析器對(duì)sql進(jìn)行語(yǔ)法分析,判斷sql是否存在語(yǔ)法錯(cuò)誤,sql中的表和相關(guān)字段是否存在等
優(yōu)化器是對(duì)執(zhí)行方案進(jìn)行選擇,選擇一個(gè)最優(yōu)的方案,例如選擇哪個(gè)索引等等
執(zhí)行器在判斷是否具有相應(yīng)的操作權(quán)限后,就開(kāi)始調(diào)用存儲(chǔ)引擎的相關(guān)接口執(zhí)行sql語(yǔ)句,在掃描數(shù)據(jù)過(guò)程中將滿足條件的數(shù)據(jù)放入緩存集合然后統(tǒng)一返回給客戶端