MySQL的底層機制

2021-09-05 11:59:02 字數 1437 閱讀 1086

mysql大致可以分為service層引擎層

目錄

service層

聯結器查詢快取

分析器優化器

執行器儲存引擎層

它包括聯結器、查詢快取、分析器、優化器、執行器。它涵蓋了mysql的大多數核心服務功能和所有的內建函式,所有跨儲存引擎的功能都在這裡實現。

負責跟客戶端建立連線、獲取許可權、維持或者管理連線。當我們連線到這個資料庫的時,我們就會遇到聯結器。這裡的連線就是tcp的握手後開始認證身份。認證完成後,聯結器就會在許可權表裡查詢你的許可權,也就是說在連線成功後還沒有斷開的時候,管理員如果修改了它的許可權也不會立即生效等到了下次連線成功後才會生效。

mysql的連線也有長連線與短連線之分,

長連線:連線成功後,如果客戶端持續有請求就一直用乙個連線

短連線:執行很少的幾次查詢之後就會自動斷開,下次查詢的時候再重新建立乙個。

因為建立連線的過程複雜且消耗資源,所以盡量使用長連線。但是,如果你全部使用長連線的時候,你可能會發現mysql的占用記憶體漲的很快,那是因為mysql在執行的過程中臨時使用的記憶體是在連線物件裡面的,這些資源只有等連線斷開的時候才會被釋放。所以這些長連線長期的累積可能會導致占用的記憶體過大,發生了oom,mysql異常重啟。

所以我們一般可以定期的去斷開長連線,然後再需要查詢的時候再重連。

當mysql拿到了乙個查詢請求的時候,它首先不會去在磁碟中查而是先去查詢快取,看看之前是不是執行過這條語句。因為之前執行的語句會以key-value的形式被快取到記憶體中,key是語句,value是結果。如果能在記憶體中查到這個key,就會直接返回快取中的執行結果。這樣可以大大的提高了速率,這樣看似很方便,但是有乙個很讓人頭疼的地方。因為牽扯到快取失效的問題,當你對乙個表有過更新之後,所有的快取就會失效然後被清除,這對乙個更新頻繁資料庫來說是非常要命的。所以查詢快取一般就適用於更新很少甚至不更新的表。

如果沒有命中快取,就會去真正的執行這條語句。所以,要對這條語句進行詞法分析與語法分析。

詞法分析就是mysql需要把你的sql語句的每乙個字串都得識別出來,知道這些字串代表著什麼。

語法分析就是當詞法分析通過後,再去根據語法規則來判斷你這條語句是否合法,如果不合法就直接報錯。

當這條語句通過分析器之後就到了優化的階段,但這時候還並沒有去執行這條語句,它在執行之前要進行優化處理。它就是在表中有多個索引的時候,決定使用哪個索引或者在一條語句關聯了多張表的時候,各個表的連線順序。因為有時候結果相同,但是效率不同,優化器就是盡量選擇效率比較好的方式。

優化過後就可以正式的執行了,這時候先要去判斷許可權,如果沒許可權會直接報錯。如果有許可權就繼續執行,這時候執行器就會根據引擎的定義來使用這個引擎的介面。

它負責資料的儲存與提取,我們常見的有innodb、myisam等

C 的底層機制

c 為我們所提供的各種訪問控制僅僅是在編譯階段給我們的限制,也就是說是編譯器確保了你在完成任務之前的正確行為,如果你的行為不正確,那麼你休想構造出任何可執行程式來。但如果真正到了產生可執行 階段,無論是c,c 還是pascal,大家都一樣,你認為c和c 編譯器產生的機器 會有所不同嗎,你 認為c 產...

C 的底層機制

c 為我們所提供的各種訪問控制僅僅是在編譯階段給我們的限制,也就是說是編譯器確保了你在完成任務之前的正確行為,如果你的行為不正確,那麼你休想構造出任何可執行程式來。但如果真正到了產生可執行 階段,無論是c,c 還是pascal,大家都一樣,你認為c和c 編譯器產生的機器 會有所不同嗎,你認為c 產生...

C 的底層機制

c 的底層機制 c 為我們所提供的各種訪問控制僅僅是在編譯階段給我們的限制,也就是說是編譯器確保了你在完成任務之前的正確行為,如果你的行為不正確,那麼你休想構造出任何可執行程式來。但如果真正到了產生可執行 階段,無論是c,c 還是pascal,大家都一樣,你認為c和c 編譯器產生的機器 會有所不同嗎...