MySql之sql執行過程

圖片描述

概述

MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件。

執行過程

編寫Sql語句基本是程序開發中的日常,執行Sql在MySql中都經歷了哪些過程呢?例如:select * from user where id=1

1.連接器

負責與客戶端建立連接、獲取權限、位置和管理連接。
  1. 連接命令:

     mysql -h$ip -P$port -u$user -p
  2. 環節:

      1. TCP握手       
      2. 認證你的身份
      3. 獲取權限
    

2.查詢緩存

當連接建立完成後就開始執行 select 語句,執行邏輯就會來到第二步:查詢緩存

MySql 在執行查詢時會先對查詢緩存進行查詢,是否之前執行過此查詢,之前執行過的語句會以key-value形式,被直接緩存在內存當中key爲語句,value是查詢結果,查詢後2種結果:

 1. 查詢緩存命中:直接返回結果(效率很高)
 2. 查詢緩存未命中: 繼續直行後面的階段,執行完成後,執行結果會被存入查詢緩存中
  1. 大多數情況下我會建議你不要使用查詢緩存,爲什麼呢?因爲查詢緩存往往利大於弊

    查詢緩存的失效非常頻繁,只要有對一個表的更新,整個表上的查詢緩存都會被清空,對於更新頻繁的表使用查詢緩存命中率就會很低,對於更新比較少的靜態表則很適用。
  2. 按需使用:

    將MySQL參數 query_cache_type 設置爲 DEMAND 這樣SQL語句都不會使用緩存,對於需要使用查詢緩存的查詢語句可以用SQL_CACHE顯示指定。(MySQL8.0 已經將查詢緩存模塊移除)
    mysql> select SQL_CACHE * from user where id=1

3.分析器

如果沒有命中查詢緩存,就要開始真正執行語句了。

首先 Mysql 需要 知道你要執行什麼,所以要對sql語句做解析

  • 詞法分析

     你輸入的是由多個字符串和空格組成的一條 SQL 語句,MySQL 需要識別出裏面的字符串分別是什麼,代表什麼。
     MySQL 從你輸入的"select"這個關鍵字識別出來,這是一個查詢語句。它也要把字符串“T”識別成“表名 T”,
     把字符串“ID”識別成“列 ID”
     
  • 語法分析

     根據詞法分析的結果,語法分析器會根據語法規則,判斷你輸入的這SQL語句是否滿足 MySQL 語法。
     如果你的語句不對,就會收到“You have an erroin your SQL syntax”的錯誤提醒,比如面這個語句 select 少打了開頭的字母“s”。

    mysql> elect * from t where ID=1;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use naer 'elect * from t where ID=1' at line 1

4.優化器

經過分析器之後,MySQL就知道你需要做什麼,在執行之前還要經過優化器的處理。

優化器是在表裏面有多個索引的時候,決定使用哪個索引;或者在一個語句有多表關聯(join)的時候,決定各個表的鏈接順序,例如這個語句執行兩個表的join:

 mysql> 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=2的記錄值Id值,再根據Id值關聯到表t1,在判斷t1 裏面d的值是否等於10

兩種方法邏輯和結果相同,但是執行效率會有不同,優化器就是要決定使用哪一種方案。

5.執行器

到這裏Mysql已經知道你想要做什麼了,優化器也幫你優化了知道該怎麼做了,那麼就開始執行語句吧。
  • 執行語句需要:

    • 判斷你是否有查詢權限有就繼續執行沒有就返回權限錯誤
    • 執行器根據表的引擎定義去掉用引擎接口(例:InnoDB)

      • 無索引:

        • 調用innoDB引擎接口取出這個表的第一行,判斷ID是否等於1,如果不是則跳過,如果是則將這行存在結果集中;
        • 調用引擎接口取 ‘下一行’ 執行相同判斷邏輯,直到取到表的最後一行
        • 執行器將所有滿足條件的行 組成的記錄作爲結果集返回給客戶端
      • 有索引

        • 與無索引邏輯差不多,第一次調用的是“取滿足條件的第一行”這個接口,之後循環的是“滿足條件的下一行”這個幾口,接口在引擎中已經定義好。

致謝

在這裏非常感謝·林曉斌·老師在極客時間發佈的文章,讓自己對數據庫有了一個好的理解。感謝各位觀衆的耐心觀看,如有錯誤請指正,謝謝!

附件

最後附上林曉斌老師在極客時間的課程

圖片描述

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