MySQL架構設計

MySQL SQL Java 數據庫 風度玉門 2019-05-21
MySQL架構設計

MySQL用了好多年了,但是對於大部分開發人員來說,還是停留在使用上面。接下來的數篇文章將記錄一下,MySQL原理的實現原理。

首先看一下MySQL的架構圖,如下所示:

MySQL架構設計

從上面的示意圖可以看出,MySQL從上到下包含了:客戶端、Server層和存儲引擎層。對於客戶端實現,可以是我們常用的MySQL命令行窗口,或者是Java的客戶端程序等等,這裡不做過多的介紹。

Server層主要包括了:連接器、查詢緩存、分析器、優化器和執行器等。大部分MySQL對用戶提供的功能,都在這一層實現:包括了內置函數的實現,存儲過程、觸發器、視圖等等。

存儲引擎層負責數據的存儲和提取,存儲引擎的實現是插件式的。也就是說用戶可以選擇自己所需要的存儲引擎,如InnoDB、MyISAM等。

連接器

連接器是MySQL服務端對外的門戶,當我們使用命令行黑窗口或者JDBC的Connection.connect(),連接到MySQL Server端時,會校驗用戶名和密碼;然後會查詢用戶對應的權限列表。當連接建立後,後續的權限範圍就在此時確定了,如果連接沒有斷開的情況下,更改了用戶的權限,此時對於該連接也不生效。

當連接建立後,如果沒有後續的操作,連接就會進入空閒狀態。此時可以使用如下命令,查看當前的連接狀態。

mysql> show processlist
MySQL架構設計

如果客戶端連接太長時間沒有使用,連接器就會將其斷開。這個參數是由 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》

相關推薦

推薦中...