「MySQL」 MySQL執行流程

MySQL知識梳理圖,一圖看完整篇文章: html

MySQL優化一直是老生常談的問題,尤爲在面試環節中,但在作MySQL的優化以前,得先了解MySQL的執行流程是怎樣,這樣才更好的去優化。web

面試過程當中也一般會問若是高併發或者用戶反映系統太卡,咱們該怎麼去優化?面試

  • 若是高併發,請求書過多,優先增長web服務器機器,作好負載均衡。
  • 若是請求靜態頁面不卡,可是動態數據卡,則說明MySQL處理的請求過多,須要再MySQL的上游封裝一層緩存層,減輕MySQL的壓力。
  • 數據庫層實際上是很是脆弱的一層,通常在應用架構設計時,一般須要將一些用戶非實時的數據或變化不頻繁的數據緩存起來,讓這些請求穿透不到DB,同時還能夠引入隊列作數據的異步更新。若是請求數激增,仍是有很是大的查詢壓力到MySQL,這時候則想辦法解決MySQL的瓶頸。

1. 執行流程圖

簡易的流程圖以下:數據庫

大體流程描述:緩存

  • MySQL客戶端經過協議將SQL語句發送給MySQL服務器。
  • 服務器會先檢查查詢緩存中是否有執行過這條SQL,若是命中緩存,則將結果返回,不然進入下一個環節(查詢緩存默認不開啓)。
  • 服務器端進行SQL解析,預處理,而後由查詢優化器生成對應的執行計劃。
  • 服務器根據查詢優化器給出的執行計劃,再調用存儲引擎的API執行查詢。
  • 將結果返回給客戶端,若是開啓查詢緩存,則會備份一份到查詢緩存中。

2. 流程圖詳解

2.1 查詢緩存

MySQL查詢緩存會保存查詢返回的完整結構。當查詢命中該緩存時,MySQL會馬上返回結果,跳過了解析、優化和執行階段。 但查詢緩存是默認不開啓的,且要求SQL和參數都是同樣,同時查詢緩存系統會跟蹤查詢中涉及的每個表,若是這些表發生變化,則該表相關的全部緩存數據均會失效。因此命中率通常較低,生產環境中也不多用到,具體流程就不描述了。若是感興趣的能夠查閱詳細資料。服務器

2.2 解析和預處理

若是查詢緩存未命中,則到解析器。解析器主要是對SQL語句進行解析,使用MySQLy語法規則進行驗證和解析查詢,並生成對應的解析樹。 獲得解析數以後,還須要作預處理,預處理則進一步檢查解釋樹是否合法,以及進行一些優化,好比檢查數據表和列是否存在,若是有計算,會將計算的結果算出來等等。架構

2.3 查詢優化器

查詢優化器是整個流程中重要的一環。查詢優化器會將預處理以後的解析樹轉化成執行計劃。一條查詢能夠有多種執行方法,最後均會返回相同結果。查詢優化器的做用就是找到這其中最好的執行計劃。   生成執行計劃的過程會消耗較多的時間,特別是存在許多可選的執行計劃時。若是在一條SQL語句執行的過程當中將該語句對應的最終執行計劃進行緩存,當類似的語句再次被輸入服務器時,就能夠直接使用已緩存的執行計劃,從而跳過SQL語句生成執行計劃的整個過程,進而能夠提升語句的執行速度。 一般所講的優化SQL,其實就是想讓查詢優化器,按照咱們的思路,幫咱們選擇最優的執行方案。併發

2.4 查詢執行計劃

查詢執行計劃,就是MySQL查詢中的執行計劃,好比是執行where語句仍是from語句,下面有一張執行順序的圖。負載均衡

最早執行的老是FROM操做,最後執行的是LIMIT操做。其中每個操做都會產生一張虛擬的表,這個虛擬的表做爲一個處理的輸入,只是這些虛擬的表對用戶來講是透明的,可是隻有最後一個虛擬的表纔會被做爲結果返回。若是沒有在語句中指定某一個子句,那麼將會跳過相應的步驟。異步

  • FORM: 對FROM的左邊的表和右邊的表計算笛卡爾積。產生虛表VT1
  • ON: 對虛表VT1進行ON篩選,只有那些符合的行纔會被記錄在虛表VT2中。
  • JOIN: 若是指定了OUTER JOIN(好比left join、 right join),那麼保留表中未匹配的行就會做爲外部行添加到虛擬表VT2中,產生虛擬表VT3, 若是 from子句中包含兩個以上的表的話,那麼就會對上一個join鏈接產生的結果VT3和下一個表重複執行步驟1~3這三個步驟,一直處處理完全部的表爲止。
  • WHERE: 對虛擬表VT3進行WHERE條件過濾。只有符合的記錄纔會被插入到虛擬表VT4中。
  • GROUP BY: 根據group by子句中的列,對VT4中的記錄進行分組操做,產生VT5.
  • CUBE | ROLLUP: 對錶VT5進行cube或者rollup操做,產生表VT6.
  • HAVING: 對虛擬表VT6應用having過濾,只有符合的記錄纔會被 插入到虛擬表VT7中。
  • SELECT: 執行select操做,選擇指定的列,插入到虛擬表VT8中。
  • DISTINCT: 對VT8中的記錄進行去重。產生虛擬表VT9.
  • ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進行排序操做,產生虛擬表VT10.
  • LIMIT:取出指定行的記錄,產生虛擬表VT11, 並將結果返回。

2.5 查詢執行引擎

執行計劃會傳給查詢執行引擎,執行引擎選擇存儲引擎來執行計劃,到磁盤中的文件中去查詢。 影響這個查詢性能最根本的緣由是什麼? 實際上是硬盤的機械運動,也就是咱們平時熟悉的IO,因此一條查詢語句是快仍是慢,就是根據這個時間的IO來肯定的。那怎麼執行IO又是什麼來肯定的?就是傳過來的這一份執行計劃.

更多文章請關注公衆號 『天澄技術雜談』

參考文章:

https://juejin.im/post/5b7036de6fb9a009c40997eb
  https://blog.csdn.net/I980663737/article/details/78421523
  https://www.cnblogs.com/rollenholt/p/3776923.html
複製代碼
相關文章
相關標籤/搜索