1. 程式人生 > 實用技巧 >一條SQL查詢語句時如何執行的?

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

  MySQL可分為Server層和儲存引擎兩部分。從MySQL5.5.5版本開始,InnoDB成為了預設儲存引擎。

  select * from T where ID=10;

聯結器

  負責跟客戶端建立連線,獲取許可權、維持和管理連線。
  mysql -h&ip -P&port -u&user -p
  執行該命令進行認證後即可連線到資料庫,如果密碼不對,則會收到 "Access denied for user"的錯誤

查詢快取

  在建立完連線後,就可以執行select語句了,這時候就會來到第二步:查詢快取。
  Mysql拿到一個查詢請求後,就會先到查詢快取中檢視,之前執行過的語句及結果可能會以key-value的形式,被直接存在記憶體中。key是查詢的語句,value是查詢的結果。如果查詢能直接在快取中找到這個key,則可以直接返回這個value。
  **大多數情況下不建議使用查詢快取**,因為查詢快取的失效非常頻繁。只要有對一個表的更新,這個表上的所有查詢快取都會被清空。(Mysql8.0開始沒有查詢快取的功能)

分析器

  分析器會先做"詞法分析",MySQL需要識別出SQL語句裡面的字串分別是什麼,代表什麼。從"select"這個關鍵字識別出這是一個查詢語句,把"T"識別成表名T,把字串"ID"識別成列ID。
  接著就會做"語法分析",根據語法規則判斷輸入的這個SQL語句是否滿足MySQL的語法,如果語句不對,則會收到 "You have an error in your SQL syntax"的錯誤提醒。

優化器

  優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在一個語句中有多表關聯的時候,決定各個表的連線順序。比如:
  select * from t1 join t2 using(ID) where t1.c=10 and t2.d = 20;
  既可以先從表t1裡面取出c=10的記錄的ID值,再根據ID值關聯到表t2,再判斷t2裡面d的值是否等於20;
  也可以先從表t2裡面取出d=20的記錄的ID值,再根據ID值關聯到表t1,再判斷t1裡面c的值是否等於10。
  這兩種執行方法的邏輯結果是一樣的,但是執行的效率會有所不同,優化器的作用就是決定選擇使用哪一個方案。

執行器

  MySQL通過分析器知道了你要做什麼,通過優化器知道了該怎麼做,於是就進入到執行器階段開始執行語句。
  開始執行的時候,會先判斷是否有執行查詢的許可權,如果沒有,就會返回沒有許可權的錯誤。如果有許可權,就會開啟表繼續執行,執行器會根據表的引擎定義,去使用這個引擎提供的介面,將滿足條件的行組成的記錄作為結果集返回給客戶端。