1. 程式人生 > >Mysql系列(一)——簡單梳理一下Mysql的查詢流程

Mysql系列(一)——簡單梳理一下Mysql的查詢流程

Mysql查詢流程

處理連線

Mysql有三種連線方式,包括:

  • TCP/IP協議,遠端連線使用,常規可採用ip埠建立連線。
  • 命名管道或共享記憶體,windows下可以採用命名管道或共享記憶體進行程序間通訊方式,但要求伺服器端與連線客服端在同一臺機器。
  • Unix域套接字,類Unix作業系統可以使用Unix域套接字檔案來進行程序間通訊。

Mysql會限制同時連線伺服器的數量,系統變數(後面我們在解釋什麼是系統變數、還有狀態變數):max_connections表示的是最大連線數(預設151)。

查詢快取

Mysql8.0之前會對查詢結果建立快取,第二次使用同樣的語句查詢時會先看快取裡面有沒有,如果有直接返回查詢結果。

注:從MySQL 5.7.20開始,不推薦使用查詢快取,並在MySQL 8.0中刪除(個人覺得,專案小併發量不是很高的可以用,但是併發量不高,相對來說緩不快取其實影響也不大。但是專案大,資料變更頻繁,快取的開銷就會很大,所以無論專案大小,保持關閉狀態都是可以的

快取的命中條件

  • 前後查詢語句必須一樣,兩個查詢請求在任何字元上的不同(例如:空格、註釋、大小寫),都會導致快取不命中。
  • 如果查詢請求中包含某些系統函式、使用者自定義變數和函式、一些系統表,如 mysql 、information_schema、 performance_schema 資料庫中的表,那這個請求就不會被快取。

快取的刪除條件

MySQL的快取系統會監測涉及到的每張表,只要該表的結構或者資料被修改,如對該表使用了INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE語句,那使用該表的所有快取記憶體查詢都將變為無效並從快取記憶體中刪除。

語法解析

這一階段主要是針對未命中快取的查詢語句進行語法檢查,並且將查詢語句中使用的表、各種查詢條件都提取出來放到MySQL伺服器內部使用的一些資料結構上來。

查詢優化

mysql會針對我們書寫的查詢語句進行優化,生成一個執行計劃(可以在查詢語句前面加explain檢視執行計劃,具體執行計劃怎麼看,後面有空再總結吧),這個執行計劃可以看到將使用哪些索引進行查詢,表之間優化後的連線順序等東西。

儲存引擎執行

MySQL從2007年開始提供了外掛式的儲存引擎API,一般來說,連線管理、查詢快取、語法解析、查詢優化這些並不涉及真實資料儲存的功能我們稱為MySQL server的功能,但真正執行查詢的是儲存引擎的功能,儲存引擎真正執行資料存取操作,儲存引擎有很多,都是基於mysql的API規範進行開發的。包括下列:

其中,InnoDB和MyISAM是我們最常用的,Mysql的預設儲