Server 層包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,涵蓋 MySQL 的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時間、數(shù)學和加密函數(shù)等),所有跨存儲引擎的功能都在這一層實現(xiàn),比如存儲過程、觸發(fā)器、視圖等。
由于建立連接比較耗資源,所以建議盡量使用長連接,但是使用長連接后,MySQL 占用內(nèi)存漲得特別快,這是因為 MySQL 在執(zhí)行過程中臨時使用的內(nèi)存是管理在連接對象里面的。這些資源會在連接斷開的時候才釋放。所以如果長連接累積下來,可能導(dǎo)致內(nèi)存占用太大,被系統(tǒng)強行殺掉(OOM),從現(xiàn)象看就是 MySQL 異常重啟了。
處理過程如下:
用戶發(fā)送請求到 tomcat ,通過 tomcat 鏈接池和 mysql 連接池建立連接,然后通過連接發(fā)送 SQL 語句到 MySQL; MySQL 有一個單獨的監(jiān)聽線程,讀取到請求數(shù)據(jù),得到連接中請求的SQL語句; 將獲取到的SQL數(shù)據(jù)發(fā)送給SQL接口去執(zhí)行; SQL接口將SQL發(fā)送給SQL解析器進行解析; 將解析好的SQL發(fā)送給查詢優(yōu)化器,找到最優(yōu)的查詢路勁,然后發(fā)給執(zhí)行器; 執(zhí)行器根據(jù)優(yōu)化后的執(zhí)行方案調(diào)用存儲引擎的接口按照一定的順序和步驟進行執(zhí)行。 舉個例子,比如執(zhí)行器可能會先調(diào)用存儲引擎的一個接口,去獲取“users”表中的第一行數(shù)據(jù),然后判斷一下這個數(shù)據(jù)的 “id”字段的值是否等于我們期望的一個值,如果不是的話,那就繼續(xù)調(diào)用存儲引擎的接口,去獲取“users”表的下一行數(shù)據(jù)。 就是基于上述的思路,執(zhí)行器就會去根據(jù)我們的優(yōu)化器生成的一套執(zhí)行計劃,然后不停的調(diào)用存儲引擎的各種接口去完成SQL 語句的執(zhí)行計劃,大致就是不停的更新或者提取一些數(shù)據(jù)出來。