天天看點

MySQL的内部元件結構

一文了解mysql的内部結構

MySQL的内部元件結構

主要包括連接配接器、查詢緩存、分析器、優化器、執行器等,涵蓋 MySQL 的大多數核心服務功能,以及所有的内置函數(如日期、時間、數學和加密函數等),所有跨存儲引擎的功能都在這一層實作,比如存儲過程、觸發器、視圖等。

mysql有非常多種類的用戶端:navicat,mysql front,jdbc,SQLyog等非常豐富的用戶端,這些用戶端要向mysql發起通信都必須先跟Server端建立通信連接配接,而建立連接配接的工作就是由連接配接器完成的。

連接配接器負責跟用戶端建立連接配接、擷取權限、維持和管理連接配接。

一個使用者成功建立連接配接後,即使你用管理者賬号對這個使用者的權限做了修改,也不會影響已經存在連接配接的權限。修改完成後,隻有再建立的連接配接才會使用新的權限設定。使用者的權限表在系統表空間的mysql的user表中。

連接配接到這個資料庫上,這時候接待你的就是連接配接器。如果使用者名或密碼不對,你就會收到一個"Access denied for user"的錯誤,然後用戶端程式結束執行。如果使用者名密碼認證通過,連接配接器會到權限表裡面查出你擁有的權限。之後,這個連接配接裡面的權限判斷邏輯,都将依賴于此時讀到的權限。

連接配接完成後,如果你沒有後續的動作,這個連接配接就處于空閑狀态,通過: show processlist 指令進行檢視。

用戶端如果長時間不發送command到Server端,連接配接器就會自動将它斷開。這個時間是由參數 wait_timeout 控制的,預設值是 8 小時。

涉及到的指令指令:

大多數情況查詢緩存就是個雞肋!mysql8.0已經移除了查詢緩存功能!

查詢緩存往往弊大于利。查詢緩存的失效非常頻繁,隻要有對一個表的更新,這個表上所有的查詢緩存都會被清空

一般建議大家在靜态表裡使用查詢緩存。如配置表、字典表....

設定查詢緩存方式

查詢緩存的常用指令

MySQL的内部元件結構
段落引用 Qcache_free_blocks:表示查詢緩存中目前還有多少剩餘的blocks,如果該值顯示較大,則說明查詢緩存中的記憶體碎片過多了,可能在一定的時間進行整理。 Qcache_free_memory:查詢緩存的記憶體大小,通過這個參數可以很清晰的知道目前系統的查詢記憶體是否夠用,是多了,還是不夠用,DBA可以根據實際情況做出調整。 Qcache_hits:表示有多少次命中緩存。我們主要可以通過該值來驗證我們的查詢緩存的效果。數字越大,緩存效果越理想。 Qcache_inserts: 表示多少次未命中然後插入,意思是新來的SQL請求在緩存中未找到,不得不執行查詢處理,執行查詢處理後把結果insert到查詢緩存中。這樣的情況的次數,次數越多,表示查詢緩存應用到的比較少,效果也就不理想。當然系統剛啟動後,查詢緩存是空的,這很正常。 Qcache_lowmem_prunes:該參數記錄有多少條查詢因為記憶體不足而被移除出查詢緩存。通過這個值,使用者可以适當的調整緩存大小。 Qcache_not_cached: 表示因為query_cache_type的設定而沒有被緩存的查詢數量。 Qcache_queries_in_cache:目前緩存中緩存的查詢數量。 Qcache_total_blocks:目前緩存的block數量。

詞法分析

文法分析

語義分析

構造執行樹

生成執行計劃

計劃的執行

優化器是在表裡面有多個索引的時候,決定使用哪個索引;

在一個語句有多表關聯(join)的時候,決定各個表的連接配接順序。

開始執行的時候,要先判斷一下你對這個表 T 有沒有執行查詢的權限,如果沒有,就會傳回沒有權限的錯誤

如果有權限,就打開表繼續執行。

存儲引擎層負責資料的存儲和提取。

其架構模式是插件式的,支援 InnoDB、MyISAM、Memory 等多個存儲引擎。現在最常用的存儲引擎是 InnoDB,它從 MySQL 5.5.5 版本開始成為了預設存儲引擎(建立表的時候)。

繼續閱讀