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