MySQL用瞭好多年瞭,但是對於大部分開發人員來說,還是停留在使用上面。接下來的數篇文章將記錄一下,MySQL原理的實現原理。
首先看一下MySQL的架構圖,如下所示:
從上面的示意圖可以看出,MySQL從上到下包含瞭:客戶端、Server層和存儲引擎層。對於客戶端實現,可以是我們常用的MySQL命令行窗口,或者是Java的客戶端程序等等,這裡不做過多的介紹。
Server層主要包括瞭:連接器、查詢緩存、分析器、優化器和執行器等。大部分MySQL對用戶提供的功能,都在這一層實現:包括瞭內置函數的實現,存儲過程、觸發器、視圖等等。
存儲引擎層負責數據的存儲和提取,存儲引擎的實現是插件式的。也就是說用戶可以選擇自己所需要的存儲引擎,如InnoDB、MyISAM等。
連接器
連接器是MySQL服務端對外的門戶,當我們使用命令行黑窗口或者JDBC的Connection.connect(),連接到MySQL Server端時,會校驗用戶名和密碼;然後會查詢用戶對應的權限列表。當連接建立後,後續的權限范圍就在此時確定瞭,如果連接沒有斷開的情況下,更改瞭用戶的權限,此時對於該連接也不生效。
當連接建立後,如果沒有後續的操作,連接就會進入空閑狀態。此時可以使用如下命令,查看當前的連接狀態。
mysql> show processlist
如果客戶端連接太長時間沒有使用,連接器就會將其斷開。這個參數是由 wait_timeout 控制的,默認時間是8小時。從上面連接過程可以看出,MySQL客戶端連接的建立過程還是比較耗時的。在我們開發的過程中,通常會使用長連接,但是如果過多的使用長連接,就會造成MySQL的內存占用量很大(MySQL5.7 以後,可以使用 mysql_reset_connection 來重新初始化連接資源,從而達到釋放內存占用的目的)。
因此在實際開發中(以Java為例),會使用DBCP、C3P0或者Druid的連接池來管理連接。其中Druid是阿裡巴巴開源的連接池管理工具,還具備監控相關的功能,功能比較強大,筆者比較推薦。
查詢緩存
當連接建立完成後,執行select 語句的時候,就會來到查詢緩存。MySQL會將Select 語句為 KEY,將查詢結果為VALUE 的形式保存在內存中。如果匹配到對應的 KEY 就會直接從內存中返回結果。
但是通常我們不會使用MySQL自身的查詢緩存,因為當有一條Update 或者 Insert 的改表語句時,就會清空對該表的所有查詢緩存。緩存的粒度比較大,可以考慮類似 Redis 的分佈式緩存做業務數據的緩存。在MySQL 8.0 中,查詢緩存直接被移除瞭。
分析器
接著上面的,如果在查詢緩存中沒有查到數據,就要真正的開始執行SQL語句瞭。分析器首先會做“詞法分析”,如:
mysql> select id, name from T where id = 1;
詞法分析就是識別上面字符串,id、name 是表的字段名,T 是表的名稱等等。之後就是語法分析,如果SQL有語法錯誤,在此時就會報錯。
優化器
當分析器處理過之後,MySQL就知道SQL 要幹什麼瞭,但是此時還需要優化器對待執行的SQL 進行優化。當然MySQL 提供的優化器,相比其他幾款商用收費的數據庫來說還是比較弱的。當然MySQL 的優化器還是可以對 join 操作,表達式計算等等進行優化,本篇不做過多的介紹。
執行器
執行階段,首先會檢查當前用戶有沒有權限操作該 SQL 語句。如果有,則繼續執行後續的操作。
參考:《極客時間:MySQL實戰》、《高性能MySQL》
❤ 如果喜歡我們的分享,歡迎加入我們,我們是大陸到台灣集運商,現在低價收貨14元每公斤, 時效3天到台灣。如果你有在大陸購物或者進貨的話請資訊我賴: welisen 加我賴吧以後有需可以備用!
關註官方微信:knifehome
❤ 威立森集運官網 https://www.welisen.com
❤ 淘寶內部優惠券 http://yhq.welisen.com/
留言列表