天天看點

一條SQL查詢語句是如何執行的

MySQL資料庫的架構

MySQL 包含 Server 層和存儲引擎層兩大部分。

存儲引擎層

負責資料的存儲和提取,MySQL 采用插件式的存儲引擎,常見的存儲引擎有

  • InnoDB
  • MyISAM
  • CSV

其中 InnoDB 是最常用的存儲引擎,也是 MySQL 的預設存儲引擎

Server 層

  • 連接配接池: 用來身份認證和權限驗證
  • 查詢緩存: 執行查詢語句的時候,會先查詢緩存,命中緩存之間傳回
  • 分析器: 沒有命中緩存的話,SQL 語句就會經過分析器,檢查你的 SQL 語句文法是否正确,分析你的 SQL 語句要幹什麼
  • 優化器: 優化成最優的執行方案去執行
  • 執行器: 執行優化後的語句,然後從存儲引擎傳回資料
一條SQL查詢語句是如何執行的

連接配接器

  • 連接配接器主要和身份認證和權限相關的功能相關,類似哨兵
  • 主要負責使用者登入資料庫,進行使用者的身份認證,包括校驗賬戶密碼,權限等操作

查詢緩存

MySQL 查詢不建議使用緩存,因為查詢緩存經常失效,是以大多數情況下都是不去使用查詢緩存的。

  • 查詢緩存主要用來緩存我們所執行的 SELECT 語句以及該語句的結果
  • 連接配接建立後,執行查詢語句的時候,會先查詢緩存,如果緩存 key 被命中,就會直接傳回給用戶端,如果沒有命中,就會執行後續的操作
  • 查詢完成後也會把結果緩存起來,友善下一次調用
  • 真正執行緩存查詢的時候還是會校驗使用者的權限,判斷該使用者是否有查詢權限

分析器

如果 沒有命中緩存,那麼就會進入分析器,分析器主要是用來分析 SQL 語句是來幹什麼的,分為兩步

  • 詞法分析,一條 SQL 語句有多個字元串組成,首先要提取關鍵字,比如 select,提出查詢的表,提出字段名,提出查詢條件等等
  • 文法分析,主要就是判斷你輸入的 sql 是否正确,是否符合 MySQL 的文法

優化器

  • 優化器的作用就是它認為的最優的執行方案去執行
  • 例如如多個索引的時候該如何選擇索引
  • 經過了優化器之後就可以讓執行器去執行sql了

執行器

  • 首先執行前會校驗該使用者有沒有權限,如果沒有權限,就會傳回錯誤資訊
  • 如果有權限,就會去調用引擎的接口,傳回接口執行的結果。

一條查詢語句如何執行

select name from student  where  age= '18' and sex = '女'
           

我們分析下這個語句的執行流程:

  1. 先檢查該語句是否有權限,如果沒有權限,直接傳回錯誤資訊
  2. 如果有權限,在 MySQL8.0 版本以前,會先查詢緩存,如果命中緩存之,間傳回,如果沒有,執行下一步。
  3. 通過分析器進行詞法分析,提取 sql 語句的關鍵元素,比如提取上面這個語句是查詢 select,提取需要查詢的表名為 student,需要查詢名為name的列,查詢條件是這個表的 age='18’和sex=‘女’。
  4. 判斷這個 sql 語句是否有文法錯誤,比如關鍵詞是否正确等等,如果錯誤就執行下一步。
  5. 接下來就是優化器進行确定執行方案,上面的 sql 語句,可以有兩種執行方案,優化器會根據自己的優化算法選擇執行效率最好的一個方案
    • 先查詢學生表中age為“18”的學生,然後判斷是否sex=女。
    • 先找出學生中sex=女的學生,然後再判斷是否age=18
  6. 進行權限校驗,如果沒有權限就會傳回錯誤資訊,如果有權限就會調用資料庫引擎接口,傳回引擎的執行結果給用戶端

總結

權限校驗—>查詢緩存—>分析器—>優化器—>權限校驗—>執行器—>執行引擎

一條SQL查詢語句是如何執行的