1. 程式人生 > 其它 >【Mysql】執行sql語句後,mysql都做了什麼?

【Mysql】執行sql語句後,mysql都做了什麼?

查資料大家都經常幹,但是你知道從執行sql到看到結果,mysql背後都做了什麼事情嗎?

一、mysql的架構

client/server 這種客戶端到服務端的架構,大家一定都很熟悉,其實 mysql 也與之類似。

  • 可以有多個客戶端與服務端連線。
  • 客戶端可以向服務端傳送增刪查改的請求。
  • 服務端根據請求,對儲存的資料進行相應處理。

在真實環境中,資料庫伺服器程序和客戶端程序可能執行在不同主機中,於是 mysql 採用 TCP 作為客戶端和伺服器之間的網路通訊協議。

mysql 伺服器在啟動時會預設申請 3306 埠,然後網路上的其他程序就可以通過 ip地址 + 埠號 的方式與這個程序建立連線。

二、mysql 如何處理請求

連線成功後,就可以進行互動操作了,這時候傳送查詢sql,然後伺服器返回結果。流程如圖:

1. 連線管理

每當有一個客戶端程序連線到伺服器程序時,伺服器程序都會建立一個執行緒專門處理與這個客戶端的互動。

客戶端退出時會與伺服器斷開連線,但是伺服器並不會立即把與這個客戶端互動的執行緒銷燬,而是快取起來

如果這時候有新的客戶端再進行連線,就把這個快取的執行緒分配給該客戶端,為了不用頻繁地建立和銷燬執行緒,節省開銷

當建立連線後,客戶端傳送請求。對於伺服器來說,接受到的請求只是一個文字訊息,這個文字訊息還需要進一步處理。

2. 解析優化

伺服器收到的是文字形式的請求,接下來還要經過幾個處理。

--查詢快取

mysql伺服器程式會把剛處理過的查詢請求和結果快取起來,如果下次有同樣請求,直接從快取中查詢結果。

這個快取是可以在不同的客戶端之間共享,比如客戶端A傳送了一個查詢請求,客戶端B也發了個一樣的,那麼就直接查詢快取中的資料。

要注意的是,雖然查詢快取有時候可以提升系統性能,但是也同樣帶來快取相關的維護。所以從MySQL 5.7.20開始,就不推薦使用查詢快取了,而在 MySQL 8.0中直接將其刪除了

--語法解析

如果快取沒有命中,那麼就要正式的查詢,所以要解析客戶端發過來的文字。

  • 判斷請求的語法是否正確。
  • 從文字中提取出要查詢的表、查詢條件放到 mysql 內部使用的一些資料結構上。

--查詢優化

解析完成後伺服器程式就可以獲取到關鍵資訊了,比如查詢條件、表。

但是,由於我們寫的sql語句執行起來效率可能不是很高,於是mysql就會對其進行一些優化。比如外連線轉為內連線、簡化表示式等等。

3. 儲存引擎

優化好後就可以真正的去執行了,誰去執行?就是這個儲存引擎,mysql 伺服器把資料的儲存和提取都封裝到了儲存引擎的模組中

“引擎”這個名字聽起來很高大上對吧?但實際上之前一直被叫做“表處理器”,功能就是接收上層傳下來的指令,然後對錶中的資料進行讀取或寫入操作

而關於引擎,網上一搜可以搜出很多種,但是不要擔心,我們最常用的就是InnoDBMyISAM,其中 InnoDB 是 mysql 預設儲存引擎。

--不要用肉體的勤奮,去掩蓋思考的懶惰--