1. 程式人生 > >MySQL邏輯架構及工作流程

MySQL邏輯架構及工作流程

  MySql並不完美,但是卻足夠靈活,能夠適應高要求的環境。同時,MySql既可以嵌入到應用程式中,也可以支援資料倉庫、內容索引和部署軟體、高可用的冗餘系統、線上事務處理系統等各種應用型別。
  為了更心如的理解MySql伺服器,我們需要理解MySql各部件之間如何協同工作。需要我們去理解它的邏輯架構。下面我們就來介紹一下MySql的邏輯架構:

MySQL的邏輯架構

  MySQL的最重要、最與眾不同的特性就是它的儲存引擎架構,這種架構將查詢處理以及其他系統任務和資料的儲存/提取相分離。所帶來的好處就是可以在使用時根據效能、特性,以及其他需求來選擇資料儲存的方式。
  下圖就是MySQL的邏輯架構圖:
  這裡寫圖片描述

  MySQL架構總共三層,在上圖中以虛線作為劃分。
  首先,最上層的服務並不是MySQL獨有的,大多數給予網路的客戶端/伺服器的工具或者服務都有類似的架構。比如:連線處理、授權認證、安全等。
  
  第二層的架構包括大多數的MySQL的核心服務。包括:查詢解析、分析、優化、快取以及所有的內建函式(例如:日期、時間、數學和加密函式)。同時,所有的跨儲存引擎的功能都在這一層實現:儲存過程、觸發器、檢視等。

  第三層包含了儲存引擎。儲存引擎負責MySQL中資料的儲存和提取。伺服器通過API和儲存引擎進行通訊。這些介面遮蔽了不同儲存引擎之間的差異,使得這些差異對上層的查詢過程透明化。儲存引擎API包含十幾個底層函式,用於執行“開始一個事務”等操作。但儲存引擎一般不會去解析SQL(InnoDB會解析外來鍵定義,因為其本身沒有實現該功能),不同儲存引擎之間也不會相互通訊,而只是簡單的響應上層的伺服器請求。

更加詳細的MySQL系統架構圖

  看完上圖後,大家是不是覺得MySQL的系統架構挺簡單的?其實不然。上圖只是MySQL系統架構的大的模組圖,其實每一層的結構都相當複雜,下圖就是詳細模組圖:
  這裡寫圖片描述

  首先,我們對該圖中的各個模組做一簡單介紹:
1、Connectors
  指的是不同語言中與SQL的互動。
  
2、Connection Pool
  管理緩衝使用者連線,執行緒處理等需要快取的需求。負責監聽對 MySQL Server 的各種請求,接收連線請求,轉發所有連線請求到執行緒管理模組。每一個連線上 MySQL Server 的客戶端請求都會被分配(或建立)一個連線執行緒為其單獨服務。而連線執行緒的主要工作就是負責 MySQL Server 與客戶端的通訊,接受客戶端的命令請求,傳遞 Server 端的結果資訊等。執行緒管理模組則負責管理維護這些連線執行緒。包括執行緒的建立,執行緒的 cache 等。

3、 Management Serveices & Utilities
  系統管理和控制工具。

4、 SQL Interface
  接受使用者的SQL命令,並且返回使用者需要查詢的結果。
  
5、 Parser
  SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的指令碼。在 MySQL中我們習慣將所有 Client 端傳送給 Server 端的命令都稱為 query ,在 MySQL Server 裡面,連線執行緒接收到客戶端的一個 Query 後,會直接將該 query 傳遞給專門負責將各種 Query 進行分類然後轉發給各個對應的處理模組。
主要功能
  a 、 將SQL語句進行語義和語法的分析,分解成資料結構,然後按照不同的操作型別進行分類,然後做出針對性的轉發到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的;
  b、 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的。

6、 Optimizer
  查詢優化器:SQL語句在查詢之前會使用查詢優化器對查詢進行優化。就是優化客戶端請求query,根據客戶端請求的 query 語句,和資料庫中的一些統計資訊,在一系列演算法的基礎上進行分析,得出一個最優的策略,告訴後面的程式如何取得這個 query 語句的結果。
  使用的是“選取-投影-聯接”策略進行查詢:
用一個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾;然後根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾。最後將這兩個查詢條件聯接起來生成最終查詢結果。

7 、Cache和Buffer
  查詢快取:主要功能是將客戶端提交 給MySQL 的 Select 類 query 請求的返回結果集 cache 到記憶體中,與該 query 的一個 hash 值 做一個對應。該 query 所取資料的基表發生任何資料的變化之後, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應用系統中, Query Cache 對效能的提高是非常顯著的。當然它對記憶體的消耗也是非常大的。
  如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等。

8 、儲存引擎介面
  MySQL區別於其他資料庫的最重要的特點就是其外掛式的表儲存引擎。MySQL外掛式的儲存引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統本身都必需的,如SQL分析器和優化器等,而儲存引擎是底層物理結構的實現,每個儲存引擎開發者都可以按照自己的意願來進行開發。
注意:儲存引擎是基於表的,而不是資料庫。

資料庫的工作流程

  相信通過上述的介紹,大家對MySQL的邏輯架構已經有了一定的瞭解,下面我們下來介紹一下資料庫具體的工作流程,先看一張圖:
  這裡寫圖片描述
  在這裡,我從資料庫架構的三個層面分別介紹資料庫的工作流程:
最上層:客戶端連線
  1、連線處理:客戶端同資料庫服務層建立TCP連線,連線管理模組會建立連線,並請求一個連線執行緒。如果連線池中有空閒的連線執行緒,則分配給這個連線,如果沒有,在沒有超過最大連線數的情況下,建立新的連線執行緒負責這個客戶端。
  
  2、授權認證:在真正的操作之前,還需要呼叫使用者模組進行授權檢查,來驗證使用者是否有許可權。通過後,方才提供服務,連線執行緒開始接收並處理來自客戶端的SQL語句。

第二層:核心服務
  1、連線執行緒接收到SQL語句之後,將語句交給SQL語句解析模組進行語法分析和語義分析。

  2、如果是一個查詢語句,則可以先看查詢快取中是否有結果,如果有結果可以直接返回給客戶端。

  3、如果查詢快取中沒有結果,就需要真的查詢資料庫引擎層了,於是發給SQL優化器,進行查詢的優化。如果是表變更,則分別交給insert、update、delete、create、alter處理模組進行處理。

第三層:資料庫引擎層
  1、開啟表,如果需要的話獲取相應的鎖。
  
  2、先查詢快取頁中有沒有相應的資料,如果有則可以直接返回,如果沒有就要從磁碟上去讀取。

  3、當在磁碟中找到相應的資料之後,則會載入到快取中來,從而使得後面的查詢更加高效,由於記憶體有限,多采用變通的LRU表來管理快取頁,保證快取的都是經常訪問的資料。

最後,獲取資料後返回給客戶端,關閉連線,釋放連線執行緒。