MySQL知識梳理圖,一圖看完整篇文章: html
MySQL優化一直是老生常談的問題,尤爲在面試環節中,但在作MySQL的優化以前,得先了解MySQL的執行流程是怎樣,這樣才更好的去優化。web
面試過程當中也一般會問若是高併發或者用戶反映系統太卡,咱們該怎麼去優化?面試
簡易的流程圖以下:數據庫
大體流程描述:緩存
MySQL查詢緩存會保存查詢返回的完整結構。當查詢命中該緩存時,MySQL會馬上返回結果,跳過了解析、優化和執行階段。 但查詢緩存是默認不開啓的,且要求SQL和參數都是同樣,同時查詢緩存系統會跟蹤查詢中涉及的每個表,若是這些表發生變化,則該表相關的全部緩存數據均會失效。因此命中率通常較低,生產環境中也不多用到,具體流程就不描述了。若是感興趣的能夠查閱詳細資料。服務器
若是查詢緩存未命中,則到解析器。解析器主要是對SQL語句進行解析,使用MySQLy語法規則進行驗證和解析查詢,並生成對應的解析樹。 獲得解析數以後,還須要作預處理,預處理則進一步檢查解釋樹是否合法,以及進行一些優化,好比檢查數據表和列是否存在,若是有計算,會將計算的結果算出來等等。架構
查詢優化器是整個流程中重要的一環。查詢優化器會將預處理以後的解析樹轉化成執行計劃。一條查詢能夠有多種執行方法,最後均會返回相同結果。查詢優化器的做用就是找到這其中最好的執行計劃。 生成執行計劃的過程會消耗較多的時間,特別是存在許多可選的執行計劃時。若是在一條SQL語句執行的過程當中將該語句對應的最終執行計劃進行緩存,當類似的語句再次被輸入服務器時,就能夠直接使用已緩存的執行計劃,從而跳過SQL語句生成執行計劃的整個過程,進而能夠提升語句的執行速度。 一般所講的優化SQL,其實就是想讓查詢優化器,按照咱們的思路,幫咱們選擇最優的執行方案。併發
查詢執行計劃,就是MySQL查詢中的執行計劃,好比是執行where語句仍是from語句,下面有一張執行順序的圖。負載均衡
最早執行的老是FROM操做,最後執行的是LIMIT操做。其中每個操做都會產生一張虛擬的表,這個虛擬的表做爲一個處理的輸入,只是這些虛擬的表對用戶來講是透明的,可是隻有最後一個虛擬的表纔會被做爲結果返回。若是沒有在語句中指定某一個子句,那麼將會跳過相應的步驟。異步
執行計劃會傳給查詢執行引擎,執行引擎選擇存儲引擎來執行計劃,到磁盤中的文件中去查詢。 影響這個查詢性能最根本的緣由是什麼? 實際上是硬盤的機械運動,也就是咱們平時熟悉的IO,因此一條查詢語句是快仍是慢,就是根據這個時間的IO來肯定的。那怎麼執行IO又是什麼來肯定的?就是傳過來的這一份執行計劃.
更多文章請關注公衆號 『天澄技術雜談』
參考文章:
https://juejin.im/post/5b7036de6fb9a009c40997eb
https://blog.csdn.net/I980663737/article/details/78421523
https://www.cnblogs.com/rollenholt/p/3776923.html
複製代碼