mysql的總體架構圖:
大致來講Mysql能夠分爲Server層和存儲引擎層兩部分。
Server層包括鏈接器、查詢緩存、分析器、優化器、執行器等。
存儲引擎負責數據的存儲和提取,其架構是插件式的。支持InnoDB、MylSAM、Memeory等多個存儲引擎。
鏈接器:
負責和客戶端創建鏈接,經過TCP實現鏈接。一般建議客戶端使用長鏈接。
由於創建鏈接的過程是很複雜的,儘可能避免重複的鏈接。
須要注意的是,若是鏈接成功以後,8個小時沒有數據傳輸的狀況下就會自動斷開。
所有使用長鏈接後,你可能會發現,有些時候 MySQL 佔用內存漲得特別快,這是由於 MySQL 在執行過程當中臨時使用的內存是管理在鏈接對象裏面的。
這些資源會在鏈接斷開的時候才釋放。因此若是長鏈接累積下來,可能致使內存佔用太大,被系統強行殺掉(OOM),從現象看就是 MySQL 異常重啓了。
怎麼解決這個問題呢?你能夠考慮如下兩種方案。
- 按期斷開長鏈接。使用一段時間,或者程序裏面判斷執行過一個佔用內存的大查詢後,斷開鏈接,以後要查詢再重連。
- 若是你用的是 MySQL 5.7 或更新版本,能夠在每次執行一個比較大的操做後,經過執行 mysql_reset_connection 來從新初始化鏈接資源。這個過程不須要重連和從新作權限驗證,可是會將鏈接恢復到剛剛建立完時的狀態。
查詢緩存:
當開啓查詢緩存後,客戶端和服務器鏈接成功後,會先去查詢緩存裏面查詢,查詢緩存的存儲方式爲key-value型,且存儲在內存中,因此速度很快,若是查詢緩存中有數據,則直接返回,就不用在進行下面的步驟了。
可是查詢緩存不建議使用,只要對錶進行了任何修改的操做,都會清除查詢緩存。因此查詢緩存只適用於長時間不更新的表。Mysql乾脆在8.0以後去除了查詢緩存。
分析器:
若是沒命中查詢緩存,就開始正在執行sql了,這時候首先會進入分析器。分析器的做用就是把客戶端傳入的sql解析成Mysql可以識別的語法,而且判斷語法是否符合規範,包括表是否存在,列是否存在,關鍵字是否錯誤等等。
優化器:
分析器完了就是優化器,優化器的做用就是對客戶端傳入的sql進行優化,以達到最好的執行效率,好比表裏面有多個索引,選擇哪一個索引比較合適等等。
執行器:
優化器以後,就經過執行器執行sql,開始執行的時候會首先判斷是否有對應表的權限,若是有權限,則根據表指定的存儲引擎去使用該存儲引擎對應的接口。