1. 程式人生 > >【MySQL】漫談MySQL體系結構

【MySQL】漫談MySQL體系結構

背景

    瞭解MySQL的架構圖,對MySQL有一個整體的把握,對於以後深入理解MySQL是有很大幫助的。比如:很多查詢優化工作實際上就是遵循一些原則讓MySQL的優化器能夠按照預想的合理方式執行。 MySQL從概念上分為四層,如下圖:這四層自頂向下分別是網路連線層,服務層(核心層),儲存引擎層,系統檔案層我們自頂向下開始講解。

網路接入層

作用     主要負責連線管理、授權認證、安全等等。每個客戶端連線都對應著伺服器上的一個執行緒。伺服器上維護了一個執行緒池,避免為每個連線都建立銷燬一個執行緒。當客戶端連線到MySQL伺服器時,伺服器對其進行認證。可以通過使用者名稱與密碼認證,也可以通過SSL證書進行認證。登入認證後,伺服器還會驗證客戶端是否有執行某個查詢的操作許可權。這一層並不是MySQL所特有的技術。
為什麼要設計成執行緒池?

      在伺服器內部,每個client都要有自己的執行緒。這個連線的查詢都在一個單獨的執行緒中執行。想象現實場景中資料庫訪問連線實在是太多了,如果每次連線都要建立一個執行緒,同時還要負責該執行緒的銷燬。對於系統來說是多麼大的消耗。由於執行緒是作業系統寶貴的資源。這時候執行緒池的出現就顯得自然了,伺服器快取了執行緒,因此不需要為每個Client連線建立和銷燬執行緒。 

服務層

作用    

      第二層服務層是MySQL的核心,MySQL的核心服務層都在這一層,查詢解析,SQL執行計劃分析,SQL執行計劃優化,查詢快取。以及跨儲存引擎的功能都在這一層實現:儲存過程,觸發器,檢視等。通過下圖來觀察服務層的內部結構:


                                                圖中紅色框中標出來的就是MySQL服務層內部執行的過程

下面來簡單分析SQL語句在服務層中具體的流程:

查詢快取    在解析查詢之前,伺服器會檢查查詢快取,如果能找到對應的查詢,伺服器不必進行查詢解析、優化和執行的過程,直接返回快取中的結果集。解析器與前處理器    MySQL會解析查詢,並建立了一個內部資料結構(解析樹)。這個過程解析器主要通過語法規則來驗證和解析。比如SQL中是否使用了錯誤的關鍵字或者關鍵字的順序是否正確等等。預處理會根據MySQL的規則進一步檢查解析樹是否合法。比如要查詢的資料表和資料列是否存在等。
查詢優化器    優化器將其轉化成查詢計劃。多數情況下,一條查詢可以有很多種執行方式,最後都返回相應的結果。優化器的作用就是找到這其中最好的執行計劃。優化器並不關心使用的什麼儲存引擎,但是儲存引擎對優化查詢是有影響的。優化器要求儲存引擎提供容量或某個具體操作的開銷資訊來評估執行時間。查詢引擎    在完成解析和優化階段以後,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資料儲存目錄檢視資料表在檔案上的體現:


.frm檔案:與表相關的元資料資訊都存放在frm檔案,包括表結構的定義資訊等。.MYD檔案:MyISAM儲存引擎專用,用於儲存MyISAM表的資料.MYI檔案:MyISAM儲存引擎專用,用於儲存MyISAM表的索引相關資訊InnoDB物理檔案結構

先建兩個InnoD儲存引擎的表:


進入MySQL資料儲存目錄檢視資料表在檔案上的體現:


注意上面的每個表都有一個*.frm與*.ibd字尾檔案他們的作用分別是:.frm檔案:與表相關的元資料資訊都存放在frm檔案,包括表結構的定義資訊等。.ibd檔案:存放innodb表的資料檔案。除了.ibd檔案InnoDB還有一種檔案的儲存格式為.ibdata檔案,那麼他們之間有什麼區別呢?這兩種檔案都是存放innodb資料的檔案,之所以用兩種檔案來存放innodb的資料,是因為InnoDB的資料儲存方式能夠通過配置來決定是使用共享表空間存放儲存資料,還是用獨享表空間存放儲存資料。獨享表空間儲存方式使用.ibd檔案,並且每個表一個ibd檔案。共享表空間儲存方式採用.ibdata檔案,所有的表共同使用一個ibdata檔案,即所有的資料檔案都存在一個檔案中。決定使用哪種表的儲存方式可以通過mysql的配置檔案中 innodb_file_per_table選項來指定。InnoDB預設使用的是獨享表的儲存方式,這種方式的好處是當資料庫產生大量檔案碎片的時,整理磁碟碎片對線上執行環境的影響較小。