【MySQL】漫談MySQL體系結構
阿新 • • 發佈:2019-01-06
背景
瞭解MySQL的架構圖,對MySQL有一個整體的把握,對於以後深入理解MySQL是有很大幫助的。比如:很多查詢優化工作實際上就是遵循一些原則讓MySQL的優化器能夠按照預想的合理方式執行。 MySQL從概念上分為四層,如下圖:這四層自頂向下分別是網路連線層,服務層(核心層),儲存引擎層,系統檔案層。我們自頂向下開始講解。網路接入層
作用 主要負責連線管理、授權認證、安全等等。每個客戶端連線都對應著伺服器上的一個執行緒。伺服器上維護了一個執行緒池,避免為每個連線都建立銷燬一個執行緒。當客戶端連線到MySQL伺服器時,伺服器對其進行認證。可以通過使用者名稱與密碼認證,也可以通過SSL證書進行認證。登入認證後,伺服器還會驗證客戶端是否有執行某個查詢的操作許可權。這一層並不是MySQL所特有的技術。在伺服器內部,每個client都要有自己的執行緒。這個連線的查詢都在一個單獨的執行緒中執行。想象現實場景中資料庫訪問連線實在是太多了,如果每次連線都要建立一個執行緒,同時還要負責該執行緒的銷燬。對於系統來說是多麼大的消耗。由於執行緒是作業系統寶貴的資源。這時候執行緒池的出現就顯得自然了,伺服器快取了執行緒,因此不需要為每個Client連線建立和銷燬執行緒。
服務層
作用
第二層服務層是MySQL的核心,MySQL的核心服務層都在這一層,查詢解析,SQL執行計劃分析,SQL執行計劃優化,查詢快取。以及跨儲存引擎的功能都在這一層實現:儲存過程,觸發器,檢視等。通過下圖來觀察服務層的內部結構:
圖中紅色框中標出來的就是MySQL服務層內部執行的過程
下面來簡單分析SQL語句在服務層中具體的流程:
查詢快取 在解析查詢之前,伺服器會檢查查詢快取,如果能找到對應的查詢,伺服器不必進行查詢解析、優化和執行的過程,直接返回快取中的結果集。解析器與前處理器 MySQL會解析查詢,並建立了一個內部資料結構(解析樹)。這個過程解析器主要通過語法規則來驗證和解析。比如SQL中是否使用了錯誤的關鍵字或者關鍵字的順序是否正確等等。預處理會根據MySQL的規則進一步檢查解析樹是否合法。比如要查詢的資料表和資料列是否存在等。儲存引擎層
作用 負責MySQL中資料的儲存與提取。 伺服器中的查詢執行引擎通過API與儲存引擎進行通訊,通過介面遮蔽了不同儲存引擎之間的差異。MySQL採用外掛式的儲存引擎。MySQL為我們提供了許多儲存引擎,每種儲存引擎有不同的特點。我們可以根據不同的業務特點,選擇最適合的儲存引擎。如果對於儲存引擎的效能不滿意,可以通過修改原始碼來得到自己想要達到的效能。例如阿里巴巴的X-Engine,為了滿足企業的需求facebook與google都對InnoDB儲存引擎進行了擴充。特點: 儲存引擎是針對於表的而不是針對庫的(一個庫中不同表可以使用不同的儲存引擎),伺服器通過API與儲存引擎進行通訊,用來遮蔽不同儲存引擎之間的差異。下面大致介紹一下MySQL中常見的的儲存引擎InnoDB 特點:支援事務,適合OLTP應用,假設沒有什麼特殊的需求,一般都採用InnoDB作為儲存引擎。支援行級鎖,從MySQL5.5.8開始,InnoDB儲存引擎是預設的儲存引擎。MyISAM 特點 不支援事務,表鎖設計,支援全文索引,主要應用於OLAP應用 場景 在排序、分組等操作中,當數量超過一定大小之後,由查詢優化器建立的臨時表就是MyISAM型別 報表,資料倉庫Memory 特點 資料都存放在記憶體中,資料庫重啟或崩潰,表中的資料都將消失,但是標的結構還是會儲存下來。預設使用Hash索引。 場景 適合儲存OLTP應用的臨時資料或中間表。 用於查詢或是對映表,例如郵編和地區的對應表。除此之外還有CSV,Federated、Archive等等。後面會開一篇部落格專門講解MySQL儲存引擎。系統檔案層
作用 該層主要是將資料庫的資料儲存在檔案系統之上,並完成與儲存引擎的互動。MyISAM物理檔案結構為為了掩飾我先建一個MyISAM儲存引擎的表:進入MySQL資料儲存目錄檢視資料表在檔案上的體現:
先建兩個InnoD儲存引擎的表:
進入MySQL資料儲存目錄檢視資料表在檔案上的體現: