mysql 數據庫的邏輯架構以下圖mysql
mysql 的邏輯的邏輯架構大致分爲四層:鏈接層、服務層、引擎層、存儲層。下面咱們就來一一介紹這四層。sql
最上層是一些客戶端和鏈接服務,包含本地socket通訊和大多數基於客戶端/服務端工具實現的相似於tcp/ip的通訊。數據庫
主要完成一些相似於鏈接處理、受權認證、及相關的安全方案。在該層上引入了線程池的概念,爲經過認證安全接入的客戶端提供線程。一樣在該層上能夠實現基於SSL的安全連接。服務器也會爲安全接入的每一個客戶端驗證它所具備的操做權限。緩存
當MySQL啓動(MySQL服務器就是一個進程),等待客戶端鏈接,每個客戶端鏈接請求,服務器都會新建一個線程處理(若是是線程池的話,則是分配一個空的線程),每一個線程獨立,擁有各自的內存處理空間,可是,若是這個請求只是查詢,不要緊,可是如果修改數據,很顯然,當兩個線程修改同一塊內存是會引起數據同步問題的。安全
服務層負責解析查詢(編譯SQL),並對其進行優化(如調整表的讀取順序,選擇合適的索引等)。對於SELECT語句,在解析查詢前,服務器會先檢查查詢緩存,若是能在其中找到對應的查詢結果,則無需再進行查詢解析、優化等過程,直接返回查詢結果。存儲過程、觸發器、視圖等都在這一層實現。服務器
存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器經過API與存儲引擎進行通訊。不一樣的存儲引擎具備的功能不一樣,這樣咱們能夠根據本身的實際須要進行選取。後面介紹MyISAM和InnoDB數據結構
數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的交互。架構
雖然從上圖看起來 MySQL 架構很是的簡單,就是簡單的幾部分而已,但實際上每一層中都含有各自的不少小模塊,尤爲是第二層服務層,結構至關複雜的。下面咱們就分別針對服務層和引擎層作一個簡單的分析。咱們看下圖體系結構:併發
1.Connectorssocket
指的是不一樣語言中與SQL的交互。
2.Management Serveices & Utilities:
系統管理和控制工具
3.Connection Pool
管理緩衝用戶鏈接,線程處理等須要緩存的需求。
4.SQL Interface
接受用戶的SQL命令,而且返回用戶須要查詢的結果。好比select from就是調用SQL Interface。
5 Parser
SQL命令傳遞到解析器的時候會被解析器驗證和解析。
解析查詢,建立一個內部數據結構(解析樹),這個解析樹主要用來SQL語句的語義與語法解析
6 Optimizer
優化SQL語句,例如重寫查詢,決定表的讀取順序,以及選擇須要的索引等。這一階段用戶是能夠查詢的,查詢服務器優化器是如何進行優化的,便於用戶重構查詢和修改相關配置,達到最優化。這一階段還涉及到存儲引擎,優化器會詢問存儲引擎,好比某個操做的開銷信息、是否對特定索引有查詢優化等。
7 Cache、Buffer
它的主要功能是將客戶端提交 給MySQL 的 Select 類 query 請求的返回結果集 cache 到內存中。該 query 所取數據的基表發生任何數據的變化以後, MySQL 會自動使該 query 的Cache 失效。在讀寫比例很是高的應用系統中, Query Cache 對性能的提升是很是顯著的。固然它對內存的消耗也是很是大的。若是查詢緩存有命中的查詢結果,查詢語句就能夠直接去查詢緩存中取數據。
8 、Pluggable Storage Engines
存儲引擎是數據庫管理系統用來從數據庫建立、讀取和更新數據的軟件模塊。
注意:存儲引擎是基於表的,而不是數據庫。
mysql的查詢流程大體是:
1)mysql客戶端經過協議與mysql服務器建鏈接,發送查詢語句,先檢查查詢緩存,若是命中,直接返回結果,不然進行語句解析,也就是說,在解析查詢以前,服務器會先訪問查詢緩存(query cache)——它存儲SELECT語句以及相應的查詢結果集。
2)語法解析器和預處理:首先mysql經過關鍵字將SQL語句進行解析,並生成一顆對應的「解析樹」。
3)查詢優化器當解析樹被認爲是合法的了,而且由優化器將其轉化成執行計劃。一條查詢能夠有不少種執行方式,最後都返回相同的結果。優化器的做用就是找到這其中最好的執行計劃。
4)而後,mysql默認使用的BTREE索引,而且一個大體方向是:不管怎麼折騰sql,至少在目前來講,mysql最多隻用到表中的一個索引。
如上圖所示,mysql 中包含了許多不一樣的存儲引擎。在這裏咱們主要介紹兩個比較經常使用的存儲引擎:MyISAM和InnoDB。
在5.5版本以前,MyISAM是MySQL的默認存儲引擎,該存儲引擎併發性差,不支持事務,因此使用場景比較少,主要特色爲:
(1)不支持事務;
(2)不支持外鍵,若是強行增長外鍵,不會提示錯誤,只是外鍵不其做用;
(3)對數據的查詢緩存只會緩存索引,不會像InnoDB同樣緩存數據,並且是利用操做系統自己的緩存;
(4)默認的鎖粒度爲表級鎖,因此併發度不好,加鎖快,鎖衝突較少,因此不太容易發生死鎖;
(5)支持全文索引(MySQL5.6以後,InnoDB存儲引擎也對全文索引作了支持),可是MySQL的全文索引基本不會使用,對於全文索引,如今有其餘成熟的解決方案,好比:ElasticSearch,Solr,Sphinx等。
(6)數據庫所在主機若是宕機,MyISAM的數據文件容易損壞,並且難恢復;
從MySQL5.5版本以後,MySQL的默認內置存儲引擎已是InnoDB了,他的主要特色有:
(1)災難恢復性比較好;
(2)支持事務。默認的事務隔離級別爲可重複讀,經過MVCC(併發版本控制)來實現的。
(3)使用的鎖粒度爲行級鎖,能夠支持更高的併發;
(4)支持外鍵;
(5)配合一些熱備工具能夠支持在線熱備份;
(6)在InnoDB中存在着緩衝管理,經過緩衝池,將索引和數據所有緩存起來,加快查詢的速度;
(7)對於InnoDB類型的表,其數據的物理組織形式是聚簇表。全部的數據按照主鍵來組織。數據和索引放在一塊,都位於B+數的葉子節點上;
(8)InnoDB表的文件存儲分爲獨立表空間和系統表空間,默認使用的是系統表空間
對比項 | MyISAM | InnoDB |
---|---|---|
外鍵 | 不支持 | 支持 |
事務 | 不支持 | 支持 |
鎖的粒度 | 表鎖 | 行鎖 |
緩存 | 只緩存索引,不緩存真實數據 | 不只緩存索引還要緩存真實數據,對內存要求較高。 |
關注點 | 節省資源、消耗少、簡單業務 | 併發寫、事務、更大資源 |
查詢性能 | 高 | 低,由於須要維護數據冊緩存 |