mysql中,一条select语句是如何执行的?
接下來通過語句弄明白整個(gè)Select語句的內(nèi)部運(yùn)行狀態(tài):
連接器:
Mysql>mysql -uroot -p
你首先連接到這個(gè)數(shù)據(jù)庫上;鏈接器負(fù)責(zé)跟客戶端建立連接,獲取權(quán)限,維持和管理連接
????? ●如果密碼不對(duì),你會(huì)收到“access denied for user”,然后客戶端程序執(zhí)行結(jié)束
????? ●如果密碼認(rèn)證通過,連接器會(huì)從權(quán)限表里查出你的權(quán)限;之后你所有的操作都依賴于此時(shí)得到的權(quán)限
連接完成后,如果你沒有后續(xù)的動(dòng)作,這個(gè)連接就處于空閑狀態(tài),sleep表明其處于空閑狀態(tài)
客戶端如果太久沒動(dòng)靜,鏈接器會(huì)自動(dòng)斷開,默認(rèn)時(shí)間8小時(shí);wait_timeout參數(shù)控制
如果,連接斷開,客戶端再次發(fā)送請(qǐng)求后,會(huì)收到一個(gè)錯(cuò)誤:“l(fā)ost connection to mysql server during query”;這時(shí)候,你需要重新連接,然后再執(zhí)行請(qǐng)求;
查詢緩存:
一個(gè)select語句,會(huì)先到查詢緩存中看看,若是以前執(zhí)行過,直接將查詢結(jié)果返回給客戶端,若是查詢緩存沒有命中,就需要執(zhí)行后面的計(jì)劃
?
分析器
如果沒有命中查詢緩存,就要開始分析器了;
mysql> select sql_cache * from T where ID=10;
詞法分析:比如,T識(shí)別為表,select識(shí)別為查詢,ID識(shí)別為字段
語句分析:語法不對(duì),會(huì)報(bào)錯(cuò)(5.5.5與8.0語法有些許不同)
優(yōu)化器
經(jīng)過分析器,mysql知道你要干什么了,在開始執(zhí)行前,還要經(jīng)過優(yōu)化器的處理
優(yōu)化器:在表里有多個(gè)索引的時(shí)候,決定使用哪個(gè)索引;在一個(gè)表里有多表關(guān)聯(lián)時(shí),決定各表的連接順序;
很多時(shí)候,兩種執(zhí)行方法的邏輯結(jié)果是一樣的,但是執(zhí)行效率會(huì)有不同,而優(yōu)化器就是決定選擇哪個(gè)方案;
執(zhí)行器
mysql> select sql_cache * from T where ID=10;
Mysql通過分析器知道了你要做什么,通過優(yōu)化器知道了該怎么做,于是進(jìn)行了執(zhí)行器階段;
開始執(zhí)行的時(shí)候,要先判斷一下你對(duì)這個(gè)表T有沒有查詢的權(quán)限,如果沒有,就會(huì)返回沒有權(quán)限的錯(cuò)誤:
“select command denied to user “”,for table T ”
如果有權(quán)限,就打開表繼續(xù)執(zhí)行。打開表的時(shí)候,執(zhí)行器就會(huì)根據(jù)表的引擎定義,去使用這個(gè)引擎提供的接口;
? ? ●調(diào)用innodb引擎接口取這個(gè)表的第一行,遍歷所有的判斷字段,如果滿足,就將查詢結(jié)果存在結(jié)果集
? ? ? 你可以在rows_examined的字段,表示這個(gè)語句執(zhí)行過程中掃描了多少行,這個(gè)值是累加的;
…………………………………………………………………………………………………………………………………………
內(nèi)容來自于林曉斌老師《mysql實(shí)戰(zhàn)45講》
總結(jié)
以上是生活随笔為你收集整理的mysql中,一条select语句是如何执行的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启动数据库报错(2)控制文件丢失
- 下一篇: mysql中一条SQLupdate语句是