MySql之sql執行過程

圖片描述

概述

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

執行過程

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

1.鏈接器

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

    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. 按需使用:spa

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

3.分析器

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

首先 Mysql 須要 知道你要執行什麼,因此要對sql語句作解析code

  • 詞法分析server

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

    根據詞法分析的結果,語法分析器會根據語法規則,判斷你輸入的這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,若是不是則跳過,若是是則將這行存在結果集中;
        • 調用引擎接口取 ‘下一行’ 執行相同判斷邏輯,直到取到表的最後一行
        • 執行器將全部知足條件的行 組成的記錄做爲結果集返回給客戶端
      • 有索引

        • 與無索引邏輯差很少,第一次調用的是「取知足條件的第一行」這個接口,以後循環的是「知足條件的下一行」這個幾口,接口在引擎中已經定義好。

致謝

在這裏很是感謝·林曉斌·老師在極客時間發佈的文章,讓本身對數據庫有了一個好的理解。感謝各位觀衆的耐心觀看,若有錯誤請指正,謝謝!
相關文章
相關標籤/搜索