11.23 分享關於邏輯架構與存儲引擎知識點

邏輯架構與存儲引擎

Mysql邏輯架構介紹

mysql 數據庫的邏輯架構如下圖

分享關於邏輯架構與存儲引擎知識點

mysql 的邏輯的邏輯架構大體分為四層:連接層、服務層、引擎層、存儲層。下面我們就來一一介紹這四層。

連接層

最上層是一些客戶端和連接服務,包含本地socket通信和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通信。

主要完成一些類似於連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,為通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基於SSL的安全鏈接。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限。

當MySQL啟動(MySQL服務器就是一個進程),等待客戶端連接,每一個客戶端連接請求,服務器都會新建一個線程處理(如果是線程池的話,則是分配一個空的線程),每個線程獨立,擁有各自的內存處理空間,但是,如果這個請求只是查詢,沒關係,但是若是修改數據,很顯然,當兩個線程修改同一塊內存是會引發數據同步問題的。

服務層

服務層負責解析查詢(編譯SQL),並對其進行優化(如調整表的讀取順序,選擇合適的索引等)。對於SELECT語句,在解析查詢前,服務器會先檢查查詢緩存,如果能在其中找到對應的查詢結果,則無需再進行查詢解析、優化等過程,直接返回查詢結果。存儲過程、觸發器、視圖等都在這一層實現。

引擎層

存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信。不同的存儲引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取。後面介紹MyISAM和InnoDB

存儲層

數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的交互。

Mysql邏輯模塊組成

雖然從上圖看起來 MySQL 架構非常的簡單,就是簡單的幾部分而已,但實際上每一層中都含有各自的很多小模塊,尤其是第二層服務層,結構相當複雜的。下面我們就分別針對服務層和引擎層做一個簡單的分析。我們看下圖體系結構:

分享關於邏輯架構與存儲引擎知識點

1.Connectors

指的是不同語言中與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的查詢流程

mysql的查詢流程大致是:

1)mysql客戶端通過協議與mysql服務器建連接,發送查詢語句,先檢查查詢緩存,如果命中,直接返回結果,否則進行語句解析,也就是說,在解析查詢之前,服務器會先訪問查詢緩存(query cache)——它存儲SELECT語句以及相應的查詢結果集。

  • 如果某個查詢結果已經位於緩存中,服務器就不會再對查詢進行解析、優化、以及執行。它僅僅將緩存中的結果返回給用戶即可,這將大大提高系統的性能。

2)語法解析器和預處理:首先mysql通過關鍵字將SQL語句進行解析,並生成一顆對應的“解析樹”。

  • 解析器將使用mysql語法規則驗證和解析查詢;
  • 預處理器則根據一些mysql規則進一步檢查解析樹是否合法。

3)查詢優化器當解析樹被認為是合法的了,並且由優化器將其轉化成執行計劃。一條查詢可以有很多種執行方式,最後都返回相同的結果。優化器的作用就是找到這其中最好的執行計劃。

4)然後,mysql默認使用的BTREE索引,並且一個大致方向是:無論怎麼折騰sql,至少在目前來說,mysql最多隻用到表中的一個索引。

存儲引擎介紹

如上圖所示,mysql 中包含了許多不同的存儲引擎。在這裡我們主要介紹兩個比較常用的存儲引擎:MyISAM和InnoDB。

MylSAM

在5.5版本之前,MyISAM是MySQL的默認存儲引擎,該存儲引擎併發性差,不支持事務,所以使用場景比較少,主要特點為:

(1)不支持事務;
(2)不支持外鍵,如果強行增加外鍵,不會提示錯誤,只是外鍵不其作用;
(3)對數據的查詢緩存只會緩存索引,不會像InnoDB一樣緩存數據,而且是利用操作系統本身的緩存;
(4)默認的鎖粒度為表級鎖,所以併發度很差,加鎖快,鎖衝突較少,所以不太容易發生死鎖;
(5)支持全文索引(MySQL5.6之後,InnoDB存儲引擎也對全文索引做了支持),但是MySQL的全文索引基本不會使用,對於全文索引,現在有其他成熟的解決方案,比如:ElasticSearch,Solr,Sphinx等。


(6)數據庫所在主機如果宕機,MyISAM的數據文件容易損壞,而且難恢復;

InnoDB

從MySQL5.5版本之後,MySQL的默認內置存儲引擎已經是InnoDB了,他的主要特點有:

(1)災難恢復性比較好;
(2)支持事務。默認的事務隔離級別為可重複讀,通過MVCC(併發版本控制)來實現的。
(3)使用的鎖粒度為行級鎖,可以支持更高的併發;
(4)支持外鍵;
(5)配合一些熱備工具可以支持在線熱備份;
(6)在InnoDB中存在著緩衝管理,通過緩衝池,將索引和數據全部緩存起來,加快查詢的速度;
(7)對於InnoDB類型的表,其數據的物理組織形式是聚簇表。所有的數據按照主鍵來組織。數據和索引放在一塊,都位於B+數的葉子節點上;

(8)InnoDB表的文件存儲分為獨立表空間和系統表空間,默認使用的是系統表空間

InnoDB和MyISAM的對比

分享關於邏輯架構與存儲引擎知識點

原文鏈接:https://www.cnblogs.com/lee0527/p/11918911.html


分享到:


相關文章: