服務器處理客戶端請求
服務器程序在處理來自客戶端的查詢請求時,大致需要分為3部分:連接管理、解析與優化、存儲引擎。
連接管理
每當有一個客戶端進程連接到服務器進程時,服務器進程都會創建一個線程專門處理與這個客戶端的交互;
斷開連接時,不會立馬銷毀線程,緩存留給下一個連接用。
連接時,需要認證才能建立連接。
解析與優化
查詢緩存
? 注意:只要該表的結構或者數據被修改,則與該表有關的所有查詢緩存都將變為無效并從查詢緩存中刪除!
雖然查詢緩存有時可以提升系統性能,但也不得不因維護這塊緩存而造成一些開銷。比如每次都要去查詢緩存中檢索,查詢請求處理完后需要更新查詢緩存,需要維護該查詢緩存對應的內存區域等。從MySQL 5.7.20開始,不推薦使用查詢緩存,在MySQL 8.0中直接將其刪除。
語法解析
? 略
查詢優化
我們寫的 MySQL 語句執行起來效率可能并不是很高, MySQL 的優化程序會對我們的話句做一些優化,如外連接轉換為內連接、表達式簡化子查詢轉為連接等一堆東西.
優化的結果就是生成一個執行計劃,這個執行計劃表明了應該使用哪些索引執行查詢,以及表之間的連接順序是啥樣,等等,我們可以使用 EXPLAIN 語句來查看某個語句的執行計劃.
存儲引擎
? 負責真實的數據的存儲和提取操作
不過需要注意的一點是 server 層和存儲引擎層交互時,一般是以記錄為單位的,以 SELECT 語句為例, server 層根據執行計劃先向存儲引擎層取一條記錄,然后判斷是否符合 WHERE條件:如果符合, 就發送給客戶端,否則跳過該記錄,然后繼續向存儲引擎索要下一條記錄。
server 層在判斷某條記錄符合要求之后,其實是先將其發送到一個緩沖區,待到該緩沖區滿了,才向客戶端發送真正的記錄,該緩沖區大小由系統變量 net_buffer _Iength 控制。