MYSQL--一条SQL查询语句是如何执行的?
select * from user where id=10
當輸入這條查詢語句之后會發生什么?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MYSQL邏輯架構圖
MYSQL大致可以分為兩大部分:Server層和存儲引擎層
下面來介紹各層中各部分的作用:
連接器:
客戶端請求建立連接,在完成TCP連接之后,開始輸入用戶名,密碼。
連接分為長連接和短連接,長連接一經建立,如果客戶端一直有請求,那么連接就不斷開。短連接執行很少的幾次查詢之后就斷開連接。
因為建立連接過程比較復雜,所以長連接較為簡便,但是因為SQL語句執行過程中臨時使用的內存在連接對象里面,如果長連接積累下來,資源占用大,MYSQL占用的內存就會非常大。
當MYSQL占用的內存達到一定程度之后,MYSQL就被系統殺死,從現象看就是MYSQL重啟了。
解決這個問題的辦法:
1.定期斷開長連接
2.初始化連接,將連接初始化,連接恢復到剛剛創建完的時候
查詢緩存:
連接建立完成之后,MYSQL獲得查詢請求,先在緩存里查看,如果緩存中有這條語句,就獲取他返回。
緩存中一般是(key,value)的格式,key是你所輸入的SQL語句。value是SQL執行完成之后的結果
但是一般不建議用緩存,因為如果某個表有更新操作,那么關于這個表的所有緩存都要清空。
MSQL也很人性化的提供給用戶自由使用緩存這個功能,可以先設置不適用緩存,需要使用的時候
使用select SQL_CACHE * from user where ID=10;
分析器:
緩存中查不到之后,開始進入分析器,先做詞法分析,分析器獲取到一些字符串與空格,即用戶輸入的SQL語句,識別出每個字符串代表什么,把select識別為select,把ID識別為列ID
之后開始語法分析,看是不是有語法錯誤,比如 輸入 elect * from user where ID=10會報錯
優化器:
分析器判斷SQL語句無誤后,進入優化器,,優化器來決定需要使用哪個索引,各個表的連接順序
執行器:
優化器優化之后,執行器開始執行這個SQL語句,開始執行之前,先判斷是不是有權限
如果用戶沒有對這個表的查詢操作,就返回沒有權限。
如果有權限,就去使用引擎提供的接口。
無索引訪問:調用引擎接口取這個表的第一行,判斷是不是符合ID=10,不是則跳過然后進入第二行,是則將結果保存在結果集中進入第二行。
有索引訪問:調用索引中滿足要求的第一行,滿足要求的第二行
?
存儲引擎:一般如果不指定存儲引擎,則默認是InnoDB引擎
總結
以上是生活随笔為你收集整理的MYSQL--一条SQL查询语句是如何执行的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML--注册页面案例
- 下一篇: java--自动装箱,拆箱