MySQL指南(一)MySQL體系結構介紹
- 2020 年 1 月 16 日
- 筆記
前言
MySQL是當今最通用的資料庫軟體之一,也是大部分人接觸最多,時間最長的資料庫軟體之一。深入了解MySQL的架構和設計對於DBA,研發和運維都非常重要,能夠幫助我們在日常工作中更好地理解和運用MySQL。
本系列主要介紹MySQL的架構設計,而不會過多涉及具體的SQL語句介紹和使用。需要讀者具備初級的MySQL和SQL基礎。
MySQL介紹
MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,屬於 Oracle 旗下產品,世界上最流行的關係型資料庫管理系統之一,在 網路應用方面,MySQL是最好的關係資料庫管理系統 (Relational Database Management System,RDBMS) 應用軟體之一。
MySQL被設計為一個可移植的資料庫,幾乎能在當前所有的作業系統上運行,比如Linux,Solaris,Mac和Windows。儘管各種系統在底層(如執行緒)實現方面各有不同,但MySQL幾乎總能保證在各平台上的物理體系結構的一致性。
MySQL是一個單進程多進程架構的資料庫,但與Oracle多進程的架構有所不同(Oracle的Windows版本也是單進程多進程的架構)。這也就是說,MySQL資料庫實例在系統上的表現就是一個進程。
區分資料庫、資料庫實例、資料庫伺服器
初入門時很多人可能會分不清這幾個概念,在這裡給出定義。
資料庫(Database)
作業系統或存儲上的數據文件的集合。MySQL資料庫中,資料庫文件可以是* .frm、*.MYD、*.MYI、*.ibd等結尾的文件,不同存儲引擎文件類型不同。
資料庫實例(Instance)
資料庫實例是一個應用程式,是位於用戶和作業系統之間的一層數據管理軟體,由後台進程或者執行緒以及一個共享記憶體區組成。用戶對資料庫數據的任何操作,都是在資料庫實例下進行的。應用程式只有通過資料庫實例才能和資料庫打交道。
資料庫伺服器(Database Server)
部署安裝資料庫實例的伺服器。
資料庫和資料庫實例的關係
通常情況下,資料庫實例和資料庫是一一對應的關係,也就是一個資料庫實例對應一個資料庫;但在集群環境中存在多個資料庫實例共同使用一個資料庫。
MySQL體系結構
用一張圖來總覽MySQL的架構組成。自上而下可以分為網路連接層,服務層(核心層),存儲引擎層,物理文件層。下面分別進行介紹。

網路連接層
負責MySQL和其他應用程式的連接交互,包括連接管理、授權認證、安全等。由客戶端程式連接和MySQL伺服器上的連接池組成。
每個客戶端連接都對應著伺服器上的一個執行緒,MySQL伺服器上維護了一個執行緒池,避免為每個連接都創建銷毀一個執行緒。當客戶端連接到MySQL伺服器時,伺服器對其進行認證。登錄認證後,還要驗證客戶端是否有執行某個查詢的操作許可權。這一層並不是MySQL所特有的技術。
使用連接池的必要性:
每個連接對應一個執行緒,實際業務中通常有許多個連接訪問資料庫伺服器,如果每次連接都要創建一個新的執行緒,連接釋放則銷毀執行緒,對於系統損耗是非常大的。通過連接池維護和快取一定的連接,由應用程式動態地對池中的連接進行申請、使用和釋放,減少了記憶體損耗,提升了資源利用率。
服務層(核心層)
該層是MySQL的核心,包括很多重要的服務。分別有:
管理服務和工具組件,系統管理和控制工具,例如備份恢復、MySQL複製、集群等 ;
SQL介面組件,接受用戶的SQL命令,並且返回用戶需要查詢的結果;
查詢分析器組件,SQL命令傳遞到解析器的時候會被解析器驗證和解析(許可權、語法結構)
優化器組件,SQL語句在查詢之前會使用查詢優化器對查詢進行優化,選取最優的路徑進行條件聯接並生成最終查詢結果;
緩衝(Cache)組件,如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取數據;
存儲引擎層
存儲引擎負責MySQL中數據的存儲與提取。 伺服器中的查詢執行引擎通過API與存儲引擎進行通訊,通過介面屏蔽了不同存儲引擎之間的差異。由於關係資料庫中數據是以表的形式存儲的,存儲引擎又被稱為表類型。
MySQL採用插件式的表存儲引擎,是其區別於其他資料庫最重要的特點。在Oracle 和SQL Server等資料庫中,所有的數據存儲管理機制都是一樣的。而MySQL提供了多種存儲引擎,用戶可以根據需求為每張表選擇特定的存儲引擎(存儲引擎是針對於表的而不是針對庫)。
關於存儲引擎的更多特性和功能,之後的文章會詳細介紹。
物理文件層
該層主要將資料庫的數據(表,索引等)存儲在文件系統上,並完成與存儲引擎的交互。存儲數據包括日誌文件,數據文件,配置文件等。
下一章將會講解底層物理文件層的相關內容。
