MySQL實戰45講讀後感:一條SQL查詢語句是如何執行的?

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


總結: 這一篇我收穫了以下幾點:

  • 一條SQL語句是如何在MySQL中執行的
  • SQL語句中經歷的步驟是哪些,主要用來做什麼。以及MySQL一些報錯,是在哪一個步驟報的

1.一條SQL語句是如何在MySQL中執行的
SQL查詢流程

2.SQL語句中經歷的步驟是哪些,主要用來做什麼。以及MySQL一些報錯,是在哪一個步驟報的

  • "客戶端"這個就不介紹了
  • 連接器”:管理連接,權限校驗。如果用戶名或者密碼錯誤會報錯“Access denied for user”,該連接爲長連接,默認連接時場爲8小時,由配置wait_timeout控制。
  • 查詢緩存”:緩存是以Key-value對的形式保存,key是SQL語句,value則是SQL查詢出來的結果,如果命中了緩存,那麼會在返回結果的時候,做權限校驗。
    建議經常修改和增加的表不要使用查詢緩存,因爲“查詢緩存的失效非常頻繁,只要有對一個表的更新,這個表上所有緩存都會被清空,這樣導致緩存命中的機率就非常低”.。
  • 分析器”:對SQL進行語義解析,對MySQL中關鍵字的識別,識別之後,然後判斷結果是否符合MySQL的語法,如果不符合則會拋出異常"You have an error in your SQL syntax"
  • 優化器”:在優化器執行之前也會驗證權限,“優化器是在表裏有多個索引時,決定使用哪個索引; 或者在一個語句關聯(join)的時候,決定各個表的連接順序(連接的順序不同,執行的效率也會不一樣)。例如:”
    mysql> select * from t1 join t2 where t1.c=10 and t2.d=20;
  • 執行器”: 執行SQL語句時會先判斷你對這個表有沒有執行權限,如果沒有則會拋出異常"ERROR 1142 (42000): SELECT command denied to user ‘b’@‘localhost’ for table ‘T’"
select * from T where ID=10;
ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

執行器根據表的引擎定義,去使用引擎提供的接口
比如我們這個例子中的表 T 中,ID 字段沒有索引,那麼執行器的執行流程是這樣的:

  1. 調用 InnoDB 引擎接口取這個表的第一行,判斷 ID 值是不是 10,如果不是則跳過,如果是則將這行存在結果集中;
  2. 調用引擎接口取“下一行”,重複相同的判斷邏輯,直到取到這個表的最後一行。
  3. 執行器將上述遍歷過程中所有滿足條件的行組成的記錄集作爲結果集返回給客戶端
    至此這個語句就執行完了

對於有索引的表,執行的邏輯也差不多。第一次調用的是“取滿足條件的第一行”這個接口,之後循環取“滿足條件的下一行”這個接口,這些接口都是引擎中已經定義好的。

PS:慢查詢日誌中看到的rows_examined的字段,表示這個語句執行過程中掃描了多少行,但是這個值並不是絕對的,因爲在有些場景下執行器調用一次,在引擎內存則掃描了多行

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