一窝爪、mysql的組成部分
? ? 下面是來自Mysql實戰(zhàn)的圖片洒放,該圖片很好的表示了mysql的組成
? ??
? ? 我們主要是和server層打交道蛉鹿,該層由連接器,分析器往湿,優(yōu)化器執(zhí)行器妖异、(查詢緩存)組成
二、連接器的作用
? ? 每個客戶端的連接都會有一個線程(在mysql5.5之后,mysql支持線程池插件领追,使得少數(shù)線程可以服務(wù)大量的服務(wù)的連接)他膳。
? ? 首先,再進行三次握手之后绒窑,建立了網(wǎng)絡(luò)連接棕孙,然校驗用戶名,原始主機信息和密碼些膨。當(dāng)然蟀俊,在校驗通過后,連接器回去權(quán)限表里面獲取用戶的權(quán)限订雾。這里肢预,這個權(quán)限將會在整個連接中被使用,即使后來修改了權(quán)限表洼哎,該權(quán)限也不會改變烫映,只能重新建立連接來修改權(quán)限。
? ? 在建立完成連接后噩峦,若沒有其余的操作锭沟,那么該連接會處于空閑狀態(tài)。這里使用show processlist來查看识补,這里冈钦,那些sleep為空閑連接,若sleep長時間不使用李请,會斷開連接瞧筛,該時間可以通過修改wait_timeout來修改,默認(rèn)為8小時导盅。建立連接相對復(fù)雜较幌,要盡量避免頻繁的建立連接,但是大量的長連接白翻,會十分占用內(nèi)存乍炉。因為mysql臨時使用的內(nèi)存是存放在連接對象當(dāng)中的绢片。
????定期斷開長連接底循。使用一段時間,或者程序里面判斷執(zhí)行過一個占用內(nèi)存的大查詢后槐瑞,斷開連接熙涤,之后要查詢再重連。
三、查詢緩存
? ? 該模塊并不是很實用糟趾,因為每次對表有修改操作慌植,都會清空該表的緩存,因此义郑,該功能只對那些基本不會修改的表(配置表等)蝶柿,查詢遠(yuǎn)遠(yuǎn)大于修改的表有一定的作用。因此在mysql8.0之后將該功能直接刪除了魔慷。
四、分析器???
? ? Mysql會解析查詢著恩,創(chuàng)建內(nèi)部數(shù)據(jù)結(jié)構(gòu)(解析樹)院尔,對其進行優(yōu)化,如喉誊,重寫查詢邀摆,決定表的讀取順序,選擇合適的索引等伍茄。當(dāng)然栋盹,這些優(yōu)化是在保證查詢不會改表查詢結(jié)構(gòu)前提下的,有點類似指令重排序敷矫。
? ? 優(yōu)化器會受到存儲引擎的影響例获,它會請求存儲引擎提供其存儲容量以及某個具體操作的開銷,以及表數(shù)據(jù)的統(tǒng)計信息等曹仗。
五榨汤、執(zhí)行器
? ? 進入執(zhí)行階段,先會驗證用戶對該表有沒有執(zhí)行權(quán)限(連接時候獲取的權(quán)限)怎茫。
? ? 對于在執(zhí)行階段收壕,條件是否有索引妓灌,先進行一個粗略的介紹。若條件不是索引蜜宪,那么虫埂,會執(zhí)行全表掃描。而索引的話圃验,它會按照一定的規(guī)則排好序掉伏,那么,就可以直接定位到指定的行损谦。