天天看點

mysql 邏輯架構圖_Mysql 邏輯架構圖及日志系統

我們經常能看到如下的邏輯架構圖,但是往往不能進行很好的記憶,看過就忘記了,也不知道它的實作方式。今天通過簡單的畫圖來簡單了解一下mysql到底是如何執行一個select語句,如何update一條語句。

mysql 邏輯架構圖_Mysql 邏輯架構圖及日志系統

1、Mysql邏輯架構圖

mysql 邏輯架構圖_Mysql 邏輯架構圖及日志系統

場景一:一條SQL語句如何執行?

1.1 一條SQL語句的執行過程

如圖:

mysql 邏輯架構圖_Mysql 邏輯架構圖及日志系統

大體來說,MySQL可以分為Server層和存儲引擎層兩部分。

Server層包括連接配接器、查詢緩存、分析器、優化器、執行器等,涵蓋MySQL的大多數核心服務功能,以及所有的内置函數(如日期、時間、數學和加密函數等),所有跨存儲引擎的功能都在這一層實作,比如存儲過程、觸發器、視圖等。

而存儲引擎層負責資料的存儲和提取。其架構模式是插件式的,支援InnoDB、MyISAM、Memory等多個存儲引擎。現在最常用的存儲引擎是InnoDB,它從MySQL 5.5.5版本開始成為了預設存儲引擎。

也就是說,你執行create table建表的時候,如果不指定引擎類型,預設使用的就是InnoDB。不過,你也可以通過指定存儲引擎的類型來選擇别的引擎,比如在create table語句中使用engine=memory, 來指定使用記憶體引擎建立表。不同存儲引擎的表資料存取方式不同,支援的功能也不同。 不同的存儲引擎共用一個Server層,也就是從連接配接器到執行器的部分。

A.連接配接器:show processlist; 檢視連接配接狀态,Sleep表示空間連接配接,query表示操作狀态

mysql 邏輯架構圖_Mysql 邏輯架構圖及日志系統

B.分析器:如果沒有命中查詢緩存,就要開始真正執行語句了。首先,MySQL需要知道你要做什麼,是以需要對SQL語句做解析。

分析器先會做“詞法分析”。你輸入的是由多個字元串和空格組成的一條SQL語句,MySQL需要識别出裡面的字元串分别是什麼,代表什麼。

MySQL從你輸入的"select"這個關鍵字識别出來,這是一個查詢語句。它也要把字元串“T”識别成“表名T”,把字元串“ID”識别成“列ID”。

做完了這些識别以後,就要做“文法分析”。根據詞法分析的結果,文法分析器會根據文法規則,判斷你輸入的這個SQL語句是否滿足MySQL文法。

C.優化器:經過了分析器,MySQL就知道你要做什麼了。在開始執行之前,還要先經過優化器的處理。

1.2 執行器的執行流程

mysql 邏輯架構圖_Mysql 邏輯架構圖及日志系統

D.執行器:MySQL通過分析器知道了你要做什麼,通過優化器知道了該怎麼做,于是就進入了執行器階段,開始執行語句。

比如我們這個例子中的表T中,ID字段沒有索引,那麼執行器的執行流程是這樣的:

調用InnoDB引擎接口取這個表的第一行,判斷ID值是不是10,如果不是則跳過,如果是則将這行存在結果集中;

調用引擎接口取“下一行”,重複相同的判斷邏輯,直到取到這個表的最後一行。

執行器将上述周遊過程中所有滿足條件的行組成的記錄集作為結果集傳回給用戶端。

總結,MySQL包含如下子系統和核心庫:

網絡連接配接和網絡通信協定子系統[NET協定建立在TCP/IP協定棧上,為上層其他子系統提供資料包的讀、寫、解析和發送]

線程、程序和記憶體配置設定子系統[自啟動準備過程]

查詢解析和查詢優化子系統

存儲引擎接口子系統

各類存儲接口子系統

安全管理子系統[驗證和通路控制等手段來保護伺服器]

日志子系統[Error日志、查詢日志、慢查詢日志、二進制日志]

其他子系統-如複制功能、錯誤處理

mysys核心庫檔案

2、Mysql日志系統

日志系統隻要有2個子產品:存儲引擎裡的redo log重做日志;伺服器-執行器中的binlog歸檔日志。

說到日志系統,需要了解幾個概念:creash-safe、redo log、binlog、WAL技術。

Redo log:用于保證crash-safe能力。innodb_flush_log_at_trx_commit =1表示每次事務的redo log 都持久化到磁盤,保證mysql異常重新開機之後資料不丢失。Sync_binlog=1參數設定為1,表示每次事務的binlog都持久化到磁盤,保證mysql異常重新開機之後binlog不丢失。

Crash-safe:有了redo log,InnoDB就可以保證即使資料庫發生異常重新開機,之前送出的記錄都不會丢失。

WAL技術:Write-Ahead Loggin,先記錄到歸檔日志redo log裡面,更新完成。InnoDB引擎在适當的時候,将這個更新記錄更新到(伺服器-執行器)磁盤。(閑時)

PS:歸檔日志大小可以進行配置

2.1 redo log日志與change buffer的差別

redo log:主要節省的是随機寫磁盤的IO消耗(轉成順序寫)。

change buffer:主要節省的則是随機讀磁盤的IO消耗。

2.2 場景一:一條SQL更新語句是如何執行的?

前提:建立表 create table T(ID int primary key,c int),插入一條ID=2的語句。

mysql 邏輯架構圖_Mysql 邏輯架構圖及日志系統

更新語句不在記憶體時的操作過程:并不會立馬從磁盤去讀入記憶體

1、更新資料頁,不在記憶體,InnoDB會将這些更新操作緩存在change buffer中,減少讀磁盤。

2、merge:将change buffer 中的操作應用到原資料頁,得到最新結果的過程。

3、merge觸發的時間點:關閉資料庫、查詢該資料頁、背景線程定期操作。

4、change buffer:可持久化的資料,可通過參數innodb_change_buffer_max_size 設定占用buffer pool裡的記憶體。

PS:普通索引更新時使用change buffer,唯一索引直接進行更新。