我們常用MySQL的查詢 select ?* from table where id =10,但是只了解表象。內(nèi)部是如何運(yùn)行的呢,需要理解MySQL的基礎(chǔ)架構(gòu)。
分為Service層和存儲引擎層派近,Service層做邏輯判斷,存儲引擎層放入或者取出數(shù)據(jù)洁桌。
下面講解:select * from T where id = 10 執(zhí)行流程
1渴丸、客戶端連接mysq服務(wù)器
? ? mysql -h -p -u -p ,會進(jìn)行用戶登錄驗(yàn)證,用戶權(quán)限驗(yàn)證
2另凌、查詢緩存(不一定有該流程)
????是對查詢結(jié)果的緩存谱轨,之前執(zhí)行過的SQL查詢結(jié)果的Key-value值。不推薦使用吠谢,因?yàn)楸斫Y(jié)構(gòu)或者數(shù)據(jù)發(fā)生改變時(shí)都會失效土童。
3、分析器
? ? 分析這條sql語句工坊,語法的正確性献汗,判斷語句類型(查詢還是更新),識別表名王污,列名罢吃,執(zhí)行的關(guān)鍵字。例如:select 執(zhí)行查找的關(guān)鍵字昭齐,T為表名尿招,id是列名。
4司浪、優(yōu)化器
? ? 選擇這表sql語句的執(zhí)行方式泊业,例如選擇索引把沼,或者連接查詢時(shí)先執(zhí)哪張表的連接查詢啊易。
5、執(zhí)行器
? ? 分析器決定了做什么饮睬,優(yōu)化器決定了怎么做租谈,輪到執(zhí)行器執(zhí)行sql語句了。
? ? 首先,判斷用戶對這張表的執(zhí)行權(quán)限割去,然后根據(jù)表的引擎定義調(diào)用該引擎的接口去T表做查詢窟却,沒有建索引的表會一行行查詢Id字段是否為10,將找到的多行記錄放到結(jié)果集中呻逆,最后返回給客戶端夸赫。