一、MySQL的邏輯架構
MySQL的整體邏輯架構如下所示
下面對各個模塊進行介紹:
1.連接器(connectors)
一些客戶端和連接服務,包含本地sock通信和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通信。主要完成一些類似於連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,爲通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基於SSL的安全鏈接。服務器也會爲安全接入的每個客戶端驗證它所具有的操作權限,根據不同語言與SQL的交互。
2.系統管理和控制工具(management services & utilities)
3.連接池(connection pool)
管理緩衝用戶連接,線程處理等需要緩存的需求。
負責監聽對 MySQL Server 的各種請求,接收連接請求,轉發所有連接請求到線程管理模塊。每一個連接上 MySQL Server 的客戶端請求都會被分配(或創建)一個連接線程爲其單獨服務。
連接線程的主要工作就是負責 MySQL Server 與客戶端的通信,接受客戶端的命令請求,傳遞 Server 端的結果信息等。線程管理模塊則負責管理維護這些連接線程。包括線程的創建,線程的 cache 等。
4.SQL接口(SQL interface)
接受用戶的SQL命令,並且返回用戶需要查詢的結果。
5.解析器(parser)
SQL命令傳遞到解析器的時候會被解析器驗證和解析。
- 將SQL語句進行語義和語法的分析,分解成數據結構,然後按照不同的操作類型進行分類,然後做出針對性的轉發到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的。
- 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的
6.查詢優化器(optimizer)
SQL語句在查詢之前會使用查詢優化器對查詢進行優化。
查詢優化器使用的策略是“選取-投影-聯接”
例如:select id,name from user where age = 18;
- 該條查詢語言先根據where語句進行選取,並不是將所有的數據查詢出來再進行過濾;
- 再根據 id,name 進行屬性投影,並不是將所有的屬性全部提取出來之後進行過濾;
- 最後將兩個查詢條件聯接起來生成最終的查詢結果。
7.查詢緩存(cache 和 buffer)
主要功能是將客戶端提交給MySQL的 select請求的返回結果集 cache 到內存中,與該 query 的一個 hash 值 做一個對應。該 Query 所取數據的基表發生任何數據的變化之後, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應用系統中, Query Cache 對性能的提高是非常顯著的,當然它對內存的消耗也是非常大的。
如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等。
8.存儲引擎(pluggable storage engines)
存儲引擎接口模塊可以說是 MySQL 數據庫中最有特色的一點了。目前各種數據庫產品中,基本上只有 MySQL 可以實現其底層數據存儲引擎的插件式管理。這個模塊實際上只是 一個抽象類,但正是因爲它成功地將各種數據處理高度抽象化,才成就了今天 MySQL 可插拔存儲引擎的特色。
注意:存儲引擎是基於表,而不是數據庫。
二、MySQL的簡單執行流程
三、存儲引擎
MyISAM |
高速引擎,擁有較高的插入,查詢速度,但不支持事務、不支持行鎖、不支持外鍵、支持3種不同的存儲格式。包含靜態型、動態型和壓縮型 |
InnoDB |
5.5之後MySQL的默認數據庫引擎,支持事務和行級鎖,事務處理、回滾、崩潰修復能力和多版本併發控制的事務安全,比MyISAM處理速度稍慢,支持外鍵。 |
ISAM |
MyISAM的前身,5.0以後不再默認安裝 |
MRG MyISAM(MERGE) |
將多個表聯合成一個表使用,在超大規模數據存儲時很有用。 |
Memory |
內存存儲引擎,擁有極高的插入,更新和查詢效率。但是會佔用和數據量成正比的內存空間。在內存上保存數據,意味着數據很有可能會丟失。 |
Falcon |
一種新的存儲引擎,支持事務處理,有可能是innoDB的替代者 |
Archive |
將數據壓縮後存儲,非常適合存儲大量的、獨立的,作爲歷史記錄的數據,但是隻能進行插入和查詢 |
CSV |
CSV存儲引擎是基於CSV格式文件存儲數據(應用於跨平臺的數據交換) |
多存儲引擎是MySQL區別於其他數據庫的一大特性,存儲引擎是針對表的;
MySQL5.5之後,默認的存儲引擎有MyISAM 變成了 InnoDB。
開發中最多使用的就是InnoDB 和 MyISAM,下面對於這兩種引擎進行介紹:
InnoDB | MyISAM | |
存儲文件 |
.frm 表定義文件 .ibd 數據文件 |
.frm 表定義文件 .myd 數據文件 .myi 索引文件 |
鎖 | 表鎖、行鎖 | 表鎖 |
事務 | acid | 不支持 |
crud | 讀和寫多 | 讀多 |
count | 掃表 | 有專門存儲的地方 |
索引結構 | B + tree | B+tree |