《Mysql 一條 SQL 語句是如何執行的?》

一:概述mysql

  - 首先須要認識一下 Mysql 總體的基礎架構sql

  - 數據庫

 

二:Mysql 的分層緩存

  - MySQL 能夠分爲 Server 層和存儲引擎層兩部分架構

 

  - Server 層函數

    - Server 層包括鏈接器、查詢緩存、分析器、優化器、執行器等,涵蓋 MySQL 的大多數核心服務功能優化

    - 以及全部的內置函數(如日期、時間、數學和加密函數等)加密

    - 全部跨存儲引擎的功能都在這一層實現,好比存儲過程、觸發器、視圖等。spa

 

  - 存儲引擎層插件

    - 而存儲引擎層負責數據的存儲和提取。

    - 其架構模式是插件式的,支持 InnoDB、MyISAM、Memory 等多個存儲引擎。

    - 如今最經常使用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始成爲了默認存儲引擎。 

 

三:執行流程

  - 1:鏈接器

    - 當在 Shell 中鏈接 Mysql 服務(mysql -h$ip -P$port -u$user -p)在完成 TCP 握手鍊接以後,鏈接器即開始身份認證

      - 若是用戶名或密碼不對,你就會收到一個"Access denied for user"的錯誤,而後客戶端程序結束執行。

      - 若是用戶名密碼認證經過,鏈接器會到權限表裏面查出你擁有的權限。

      - 以後,這個鏈接裏面的權限判斷邏輯,都將依賴於鏈接時讀到的權限

      - PS

        - 根據這裏的身份認證能夠知道,權限的認證,是在鏈接 Mysql 時完成的。

        - 因此,即便管理員在鏈接狀態時修改了權限,也不會影響已經存在的鏈接。以後的連接纔會使用新的權限狀態。

    

    - 每一個鏈接的連接狀態

      - show processlist; 

    

    - 客戶端若是太長時間沒動靜,鏈接器就會自動將它斷開。

      - 這個時間是由參數 wait_timeout 控制的,默認值是 8 小時

      - 若是在鏈接被斷開以後,客戶端再次發送請求的話,就會收到一個錯誤提醒: Lost connection to MySQL server during query。

      - 這時候若是你要繼續,就須要重連,而後再執行請求了。

 

    - 長連接/短鏈接

      - 數據庫裏面,長鏈接是指鏈接成功後,若是客戶端持續有請求,則一直使用同一個鏈接。

      - 短鏈接則是指每次執行完不多的幾回查詢就斷開鏈接,下次查詢再從新創建一個。

      - PS:

        - 長連接過多會致使 Mysql 的內存使用快速增加。

          - 這是由於 MySQL 在執行過程當中臨時使用的內存是管理在鏈接對象裏面的。

          - 這些資源會在鏈接斷開的時候才釋放

          - 因此若是長鏈接累積下來,可能致使內存佔用太大,被系統強行殺掉(OOM),從現象看就是 MySQL 異常重啓了。

        - 解決

          - 按期斷開長鏈接並重啓。

          - 若是你用的是 MySQL 5.7 或更新版本,能夠在每次執行一個比較大的操做後,經過執行 mysql_reset_connection 來從新初始化鏈接資源。

 

  - 2:查詢緩存

    - MySQL 拿到一個查詢請求後,會先到查詢緩存查詢

    - 若是你的查詢可以直接在這個緩存中找到 key,那麼這個 value 就會被直接返回給客戶端。

    - 可是大多數狀況下我會建議你不要使用查詢緩存,爲何呢?由於查詢緩存每每弊大於利。

      - 查詢緩存的失效很是頻繁,只要有對一個表的更新,這個表上全部的查詢緩存都會被清空。

      - 所以極可能你費勁地把結果存起來,還沒使用呢,就被一個更新全清空了。

      - 對於更新壓力大的數據庫來講,查詢緩存的命中率會很是低

      - 除非你的業務就是有一張靜態表,很長時間纔會更新一次。

      - 好比,一個系統配置表,那這張表上的查詢才適合使用查詢緩存。

      - 在 MySQL 8.0 中,緩存功能完全被廢棄。

  

  - 3:分析器

    - 解析SQL 語句

    - 分析整個的 SQL 動做

 
  - 4:優化器
    - 選擇查找記錄的最優方案
 
  
  - 5:執行器
    - 調用存儲引擎執行
相關文章
相關標籤/搜索