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


一:概述

  - 首先需要認識一下 Mysql 整體的基礎架構

  - 

 

二:Mysql 的分層

  - MySQL 可以分為 Server 層和存儲引擎層兩部分

 

  - Server 層

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

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

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

 

  - 存儲引擎層

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

    - 其架構模式是插件式的,支持 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:執行器
    - 調用存儲引擎執行
 


免責聲明!

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



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