1. 程式人生 > >MySQL基礎架構

MySQL基礎架構

mysql 基本架構示意圖:

聯結器:

負責跟客戶端建立連線、獲取許可權、維持和管理連線。

平常使用中要儘量使用長連線,但是當全部使用長連線後,mysql佔用記憶體會漲的特別快,原因是mysql在執行過程中臨時使用的記憶體是管理在連線 物件裡面的,這些資源會在連線斷開的時候才釋放,大量長連線積累下來會導致記憶體佔用太大,會被系統強行殺掉OOM,從現象看就是mysql異常重啟了。

解決方案:

1.定期斷開長連線。一段時間後斷開連線,會程式裡面判斷執行一個佔用記憶體的大查詢後,斷開連線,之後查詢再重連。

2.mysql5.7以上,可以在每次執行一個比較大的操作後,通過執行mysql_reset_connection 來重新初始化連線資源,這個過程不需要重連和重新許可權驗證,但會將連線恢復到剛剛建立完的狀態

查詢快取

執行過的語句和結果 會以key-value形式存在記憶體中,如何能命中key,value會直接返回

但是查詢快取往往利大於弊,大多數情況下不被建議使用,因為查詢快取的失效非常頻繁,只要對該表有更新,這個表上的查詢快取都會被清空,對於更新壓力大的資料來說,查詢快取命中率會非常低,如果對於業務是一張靜態表,很長時間才會更新就比較適合。

mysql也提供了按需使用的方式,引數 query_cache_type 設定成 DEMAND,這樣的sql語句預設不適用查詢快取,只有當確認要使用查詢快取的語句是,可以用SQL_CACHE指定(該功能在mysql8.0版本去除了)

mysql> select SQL_CACHE * from T where ID=10;
 

分析器

對sql語句進行詞法分析,然後進行語法分析

優化器

當表裡有多個索引的時候,會決定使用哪個索引,在多表關聯的時候,決定各個表的連線順序,優化器作用是決定選擇使用具體的一個方案達到效率最大化

執行器

會先判斷你對語句是否有許可權,有許可權才會繼續去執行,執行器會遍歷所有滿足條件的行組成記錄作為結果集返回給客戶端。

慢日誌中的rows_examined可以表示語句執行過程中掃描了多少行,該值是執行器每次呼叫引擎獲取資料行累加的。

在一些特定的場景下,執行器每呼叫一次,在引擎內部會掃描多行,所以rows_examined有時候並不是完全相同的