Mysql語句的執行過程


當你希望MySQL能夠以更高的性能運行查詢時,最好的辦法是弄清楚MySQL是如何優化和執行查詢。《高性能MySQL》

衡量查詢開銷的三個指標 

  1. 響應時間掃描的行數
    1. 服務時間(處理語句真正花的時間)
    2. 排隊時間(等待資源,例如IO,行鎖等)
  2. 掃描的行數
  3. 返回的行數

當刪除了搜索條件列的索引時,語句進行全表掃描,掃描的行數為5073。如圖一

    圖一 掃描行數

MySQL客戶端與服務器端的通信特點

客戶端與服務器之間是半雙工通信,意味着服務器與客戶端之間的傳遞數據不可以同時發生。

  1. 客戶端使用一個單獨的數據包將查詢傳給服務器。當語句過長時,可能受到服務器端max_allowed_packet的限制。
  2. 服務器響應給用戶的數據通常會很多,由多個數據包組成。(客戶端不斷接受服務器推送的數據,客戶端沒有辦法讓服務器停下來。客戶端只能被動的接受)。

查詢的執行流程

 語句的處理過程

                圖二 語句的處理過程

1.連接數據庫
  1. 客戶端發起一條Query請求,服務器端的‘連接管理模塊’接收請求。
  2. 將請求轉發到‘連接進/線程模塊’。
  3. 調用‘用戶模塊’來進行授權檢查。
  4. 通過檢查后,‘連接進/線程模塊’從‘線程連接池’中取出空閑的被緩存的連接線程和客戶端請求對接,如果失敗則創建一個新的連接請求。
 
2.處理請求
  1. 查詢緩存 通過一個大小寫敏感的哈希查找判斷查詢是否命中查詢緩存的數據。
    1. 命中查詢緩存,用戶權限沒有問題,MySQL直接從緩存中拿結果返回給客戶端。
  2. 查詢優化處理解析SQL、預處理、優化SQL的執行計划),將SQL轉化成一個執行計划。【具體過程查看 圖二】
    1. 解析和預處理生成一棵解析樹(《編譯原理》的知識),MySQL按照其語法對解析樹進行驗證和解析查詢。判斷語法是否合法。這里可以對比一下存儲過程和 PHP 或者 Java 的預處理過程,它們就是因為存儲了預處理過程的結果,所以可以達到 SQL 的拼接和提高一些效率。
    2. 優化器和執行計划:將語法樹轉化為執行計划(子任務),並選擇成本盡量小的執行計划。
      1. 優化過程書上介紹了很多情況,請參考書籍6.43章
      2. 執行計划 MySQL會生成一個指令樹,然后通過存儲引擎完成這棵樹並返回結果 如圖2
  3. 查詢執行引擎  查詢執行引擎則根據執行計划來完成整個查詢。在執行計划時,存儲引擎通過調用實現的接口來完成。

   

   圖三 四個表的表連接查詢的執行計划指令樹

 

3.返回結果
  1. 如果查詢可以被緩存,MySQL將結果存放到查詢緩存里。
  2. MySQL將結果集返回給客戶端是一個逐步返回的過程;數據庫開始產生第一個結果時,就可以開始向服務器返回結果集。
    1. 使用MySQL客戶端、服務器通信協議進行封包。
    2. 通過Tcp協議傳輸數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM