一起聊聊MySQL邏輯體系架構

2022-03-15 19:00:49
本篇文章給大家帶來了關於中的相關知識,其中主要介紹了mysql邏輯體系架構的相關問題,大致架構分為三層,分別用於連線執行緒處理、包含大部分mysql核心服務和包含儲存引擎,希望對大家有幫助。

推薦學習:

Mysql邏輯體系架構(大致架構分為三層)

第一層:連線執行緒處理

  • 使用者端——>連線執行緒處理(連線處理,授權認證,安全)

所包含的服務並不是mysql所獨有的技術,他們都是服務於C/S程式或者這些程式所需要的(連線處理,授權認證,安全性等等)

第二層:包含大部分mysql核心服務

  • 查詢快取——>解析器——>優化器——>執行查詢

查詢快取,解析,分析,優化,快取,所有內建函數(日期,時間,數學和加密函數)同時,所有的儲存引擎提供的功能都集中在這一層(儲存過程,觸發器,檢視)

流程:在解析查詢之前,要先查詢快取,快取只能儲存查詢的資訊和結果資料,如果請求一個查詢在快取中存在,就不需要解析,優化和執行查詢了,直接返回快取中所存放的這個查詢的結果

第三層:包含儲存引擎

  • 儲存引擎負責mysql中資料的儲存和提取(和Linux下的檔案系統類似)

每種儲存引擎都有優勢及劣勢,中間的服務層通過API和儲存引擎進行通訊,這些API介面遮蔽了不同儲存引擎之間的差異,對於查詢層儘可能的透明化。

儲存引擎API包含了十幾個底層函數,如執行 「 開始一個事務 」 ,或取出有特定主鍵的行,但儲存引擎一般不會去解析SQL,(InnoDB會解析外來鍵定義,因為其本身沒有實現該功能),不同儲存引擎之間也不會相互通訊,而只是簡單的響應上層的伺服器請求。

Mysql邏輯體系架構—詳細介紹(分為八個步驟)

1.Connectors

  • 指的是不同預言中與SQL的互動

Nactive C API,JDBC,ODBC,.NET,PHP,Python,Perl,Ruby,VB

2. Enterprise Management Services & Utilities

  • 系統管理和控制工具

Backup & Recovery,Security,Replication,Cluster,Partitioning,Instance Manager,INPORMATICN_SCHEMA,Administrator,Workbench,Query Browser,Migration Toolkit

3. Connection Pool(連線池)

  • 管理緩衝使用者連線,執行緒處理等需要快取的需求。

  • 負責監聽對MySQL Server的各種請求,接受連線請求,轉發所有連線請求到執行緒管理模組。

  • 每一個連線上MySQL Server的使用者端請求都會被分配(建立)一個連線執行緒為其單獨服務,並對連線執行緒進行了快取,因此不需要為每個client連線單獨建立和銷燬,而連線執行緒的主要工作就是負責MySQL Server與使用者端的通訊,接收使用者端的命令請求,傳遞Server端的結果資訊,執行緒管理模組則負責管理維護這些連線執行緒,包括執行緒的建立,執行緒的cache等等

Authentication -Thread Reuse - Connection Limits - Check Memory -Caches

4.SQL Interface(SQL介面)

  • 接受使用者的SQL命令,並且返回使用者需要查詢返回的結果,比如select from就是呼叫SQL Interface

DML,DDL,Stored Procedures,Views,Triggers,etc

5.Parser(解析器)

  • SQL命令傳遞到解析器的時候會被解析器驗證和解析,解析器是由Lex和YACC實現的,是一個很長的指令碼,在MySQL中我們習慣將所有Client端發給Server端的命令都稱為query,在MySQL Server裡面,連線執行緒接收到使用者端的一個Query後,會直接將query傳遞給專門負責將各種Query進行分類然後轉發給各個對應的處理模組

主要功能:

  • a. 將SQL語句進行語意和語法分析,分解成資料結構,然後按照+同的操作型別進行分類,做出針對性的轉發到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的

  • b. 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的

Query Translation,Object Privilege

6.Optimizer(查詢優化器)

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

Access Paths,Statistics

7.Cache 和 Buffer(查詢快取)

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

Global and Engine Specific Caches & Buffers

8.pluggable storage Engines(外掛式儲存引擎)

  • 儲存引擎介面:MySQL區別於其他資料庫的最重要的特點就是其外掛式的表儲存引擎。

  • MySQL外掛式的儲存引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統都必須的,比如SQL分析器和優化器等,而儲存引擎是底層物理結構的實現。每個儲存引擎開發者都可以按照自己的意願進行開發。

9.file system

  • 檔案系統,資料,紀錄檔(redo,undo)索引,錯誤紀錄檔,查詢記錄,慢查詢等

注意:儲存引擎是基於表的,而不是資料庫

資料庫的工作流程

建立TCP連線——>驗證使用者——>建立執行緒解析SQL——>生成執行計劃——>開表——>搜尋buffer看所需資料頁是否被快取——>從磁碟掃描資料——>獲取資料並寫入buffer pool——>返回資料給使用者端——>關閉表——>關閉執行緒——>關閉連線

  • 最上層:使用者端連線

1.連線處理:使用者端同資料庫服務層建立TCP連線,連線管理模組會建立連線,並請求一個連線執行緒,如果連線池中有空閒的連線執行緒,則分配給這個連線,如果沒有,在沒有超過最大執行緒連線數的情況下,建立新的連線執行緒負責這個使用者端

2.授權認證:在query操作之前,還需要呼叫使用者模組進行授權檢查,來驗證使用者是否有許可權,通過後,方才提供服務,連線執行緒開始接受並處理來自使用者端的SQL語句

  • 第二層:核心服務

1.連線執行緒接收到SQL語句之後,將語句交給SQL語句解析模組進行語法和語意分析。

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

3.如果查詢快取中沒有結果,則需要查詢資料庫引擎層,將SQL語句發給優化器,進行查詢的優化,如果是表變更,則分類交給insert,update,delete,create,alert處理模組進行處理

  • 第三層:資料庫引擎層

1.開啟表,如果需要的話獲取相應的鎖。

2.先查詢快取頁中有沒有相應的資料,如果有則可以直接返回,如果沒有則從磁碟上去讀取

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

4.最後,獲取資料後返回給使用者端,關閉連線,釋放連線執行緒。

FAQ分析

1.什麼是外掛式儲存引擎

儲存引擎就是將資料對磁碟進行讀寫操作,不同的儲存引擎,讀寫操作方式也不同,事務,鎖等都不一樣因為我們有不同的業務需求,所以會有很多的儲存引擎,在一個資料庫中,因為儲存引擎是基於表的,所以不同的表可以有不同的儲存引擎,允許將儲存引擎載入到正在執行的MySQL伺服器中,這就是外掛式儲存引擎

2.什麼是LRU快取

一種快取淘汰機制策略演演算法,因為快取的記憶體總是有限的,所以快取滿了就要刪除一些內容,給新內容騰位置,而在LRU機制下,淘汰的資料被稱為無用資料,LRU的全稱是Least Recently Used,也就是我們認為最近使用過的資料都是有用的,很久都沒用過的資料應該就是無用的,記憶體滿了就優先刪除那些最近很久沒用過的資料

  • 在JVM中Ehcache的快取策略包含

  1. LRU - least recently used(最近最少使用)

  2. LFU - least frequently used(最不經常使用)

  3. FIFO - first in first out, the oldest element by creation time(清除最早快取的資料,不關心是否經常使用)

推薦學習:

以上就是一起聊聊MySQL邏輯體系架構的詳細內容,更多請關注TW511.COM其它相關文章!