查詢SQL語句到底是如何執行的

查詢SQL語句到底是如何執行的

想必大家對於SQL語句或多或少都有些瞭解,但你知道SQL語句在MySQL上是怎麼運行的麼,它到底做了哪些操作呢?

SQL執行過程示意圖

在這裏插入圖片描述

連接器

連接器,顧名思義,作用就是與MySQL服務器建立連接用的。連接器負責跟客戶端建立連接、維持和管理連接。客戶端如果太長時間沒動靜,連接器就會自動將它斷開。這個時間是由參數wait_timeout控制的,默認值是8小時。

曾經看到過一個案例:一個政府機構性質的項目,由於該機構每天下午5點左右下班,第二天早上9點上班,在這期間,系統無人使用,機構工作人員上班後登陸系統,發現系統異常,開發人員查詢日誌後發現數據庫連接異常。正是由於wait_timeout的默認值8小時引起的,這種情況可以相應的調整wait_timeout的數值即可。

查詢緩存

查詢緩存就是對查詢結果進行緩存,是一個基於key-value的緩存,其中key是查詢的SQL字符串,只有完全一樣的SQL才使用同一個緩存。

當成功建立連接後,MySQL優先回去查詢緩存中看一下有沒有緩存結果,如果有直接返回結果。

可以用SQL_CACHE顯式指定需要緩存的語句:

SELECT SQL_CACHE * FROM t1 WHERE a=1;

查詢緩存往往弊大於利:

  • 查詢緩存失效頻繁,對一個表的更新操作都會導致這個表的所有查詢緩存失效。
  • 查詢緩存佔用內存。
  • 在現在NOSQL的日益壯大的今天,查詢緩存顯得有點雞肋。

所以MySQL 8.0版本直接將查詢緩存的整塊功能移除了。個人建議:儘量不要使用查詢緩存或者在特殊場景使用。

分析器

在這一步,分析器對SQL語句進行解析:

  1. 詞法分析
  2. 語法分析

優化器

進行了詞法分析和語法分析之後,要經過優化器的處理,再交給執行器執行。在這一步,優化器根據SQL語句做相應的優化,包括選擇索引,表的連接順序,表達式優化,索引下推等,相關詳情可參考SQL優化之Select語句

執行器

MySQL通過分析器知道了你要做什麼,這樣做是否合法,通過優化器知道了到底要怎麼做,給出優化的執行計劃,之後就到達了執行器這裏,開始執行:

  1. 開始執行的時候,要先判斷用戶對這個表T有沒有查詢權限,如果沒有,就會返回權限的錯誤;

  2. 如果有權限,就打開表繼續執行。打開表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的接口。

然後將執行結果返回給客戶端。

到這裏,整個SQL的執行流程已經完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章