mysql單表關(guān)聯(lián)查詢,Mysql是如何完成一次數(shù)據(jù)查詢的?
MySQL是如何完成一次數(shù)據(jù)查詢的?這是一個(gè)很經(jīng)典的問(wèn)題,對(duì)于理解數(shù)據(jù)庫(kù)執(zhí)行過(guò)程是個(gè)不錯(cuò)的開端。
MySQL執(zhí)行一條select的過(guò)程大致概述如下建立連接客戶端發(fā)起select語(yǔ)句,mysql接收判斷查詢語(yǔ)句是否存在于緩存中分析器做語(yǔ)法分析和檢驗(yàn)優(yōu)化器優(yōu)化語(yǔ)句執(zhí)行器執(zhí)行查詢,并保存到緩存中具體執(zhí)行過(guò)程首先客戶端通過(guò)TCP發(fā)送連接請(qǐng)求到mysql連接器,連接器會(huì)對(duì)該請(qǐng)求進(jìn)行權(quán)限驗(yàn)證及連接資源分配。建立連接后,客戶端發(fā)送一條select語(yǔ)句,MySQL收到該語(yǔ)句后,通過(guò)命令分發(fā)器判斷其是否是一條select語(yǔ)句。MySQL在開啟查詢緩存的情況下,會(huì)先在查詢緩存中查找該SQL是否完全匹配,如果完全匹配,驗(yàn)證當(dāng)前用戶是否具備查詢權(quán)限,如果權(quán)限驗(yàn)證通過(guò),直接返回結(jié)果集給客戶端,該查詢也就完成了。如果不匹配繼續(xù)向下執(zhí)行。如果在查詢緩存中未匹配成功,則將語(yǔ)句交給分析器作語(yǔ)法分析。MySQL通過(guò)分析語(yǔ)法知道要查的內(nèi)容。這步會(huì)對(duì)語(yǔ)法進(jìn)行檢驗(yàn),如果語(yǔ)法不對(duì)就會(huì)返回語(yǔ)法錯(cuò)誤中斷查詢。分析器的工作完成后,將語(yǔ)句傳遞給預(yù)處理器,檢查數(shù)據(jù)表和數(shù)據(jù)列是否存在,解析別名看是否存在歧義等語(yǔ)句解析完成后,MySQL就知道要查的內(nèi)容了,之后會(huì)將語(yǔ)句傳遞給優(yōu)化器進(jìn)行優(yōu)化(通過(guò)索引選擇最快的查找方式),并生成執(zhí)行計(jì)劃。最后,交給執(zhí)行器去具體執(zhí)行該查詢語(yǔ)句。執(zhí)行器開始執(zhí)行后,會(huì)逐漸將數(shù)據(jù)保存到結(jié)果集中,同時(shí)會(huì)逐步將數(shù)據(jù)緩存到查詢緩存中,最終將結(jié)果集返回給客戶端。以下是一張MySQL結(jié)構(gòu)圖,結(jié)合圖有助于理解,希望回答對(duì)您有所幫助。