MYSQL---執行流程

通過本文,我們將瞭解到以下幾個問題。

一、思考

問題一:一條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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章