通過本文,我們將瞭解到以下幾個問題。
一、思考
問題一:一條SQL語句在MYSQL中是如何執行的?
問題二:MYSQL是如何做到同時處理多個請求的?
二、分析
備註:本文主要參考《極客時間:MySql實戰45講》
-
MySQL執行流程圖
-
各模塊作用
1.連接器
- 客戶端連接MySql服務器命令
mysql -h(IP地址) -P(端口號) -u(用戶名)-p
- 連接器的作用
1.負責與客戶端建立TCP連接。
2.連接建立之後,驗證用戶名密碼。
3.查詢權限表,驗證權限(當連接建立之後,即使使用管理員賬號修改了此賬號密碼,依然不影響此連接內的操作,除非重新再次建立連接)。
- 空閒連接
建立連接之後,如果沒有後續操作,則該連接處於空閒狀態。通過SHOW PROCESSLIST命令可以查看空閒連接(Command:Sleep):
如果客戶端太長時間沒有動作,則連接器將會斷開此連接。可通過以下命令查看默認等待時間(8小時):
- 短連接
每次執行完很少幾次查詢就斷開連接,下次查詢重新建立一個連接。建立連接的過程比較複雜,建議使用長連接。
- 長連接
如果客戶端持續請求,則一直使用同一個連接。當使用大量長連接時會使MYSQL內存增長特別快。可以通過定期斷開長連接或者msyql_reset_connection命令重新創建連接。
2.查詢緩存
- 緩存存儲形式
key:SQL語句 value:結果,如果緩存命中返回,否則執行後續流程。
- 緩存參數
1.通過參數“query_chae_type”,控制是否開啓緩存
2.在SQL語句中控制是否使用緩存
SELECT SQL_CACHE * FROM t WHERE id='1';
對於經常動態更新的表查詢緩存的效率會變的非常低,而對於不需要變動的靜態表可以使用緩存。
在MYSQL8.0之後已經徹底移除緩存,如果需要緩存可以使用Redis。
3.分析器
- 詞法分析
提取Mysql關鍵詞,判斷是增刪查改的哪一種。
- 語法分析
判斷SQL語句是否符合Mysql語法規則。
4.優化器
優化器作用:
1.當表中有多個索引時,選擇使用哪一個索引。
2.多表關聯查詢時,決定各個表的連接順序。
5.執行器
1.判斷對錶T是否有執行權限。
2.如果有權限,打開表。根據表的存儲引擎定義去調用對應存儲引擎的接口。
三、回答開篇
問題一:一條SQL語句在MYSQL中是如何執行的?
通過上文分析,我們已經瞭解到了MYSQL的基本執行流程,並分析了各個部分的作用。
問題二:MYSQL是如何做到同時處理多個請求的?
MYSQL連接管理器是多線程處理模式,每一個連接請求過來會創建一個線程進行處理。當然可以通過參數設置線程緩存數量(默認爲0),這樣一個新的請求會判斷線程緩存中是否有可用線程,這樣可以避免大量的線程創建和銷燬帶來的開銷。具體請看:https://zhuanlan.zhihu.com/p/43941022