總體上,我們可以把mysql分為三層,跟客戶端對接的連線層,真正執行操作的服務層,跟硬體打交道的儲存引擎層。
客戶端要連線到mysql伺服器3306埠,必須要跟服務端建立連線,那麼管理所有的連線,驗證客戶端的身份和許可權,這些功能都在連線層完成。
主要包括聯結器、查詢快取、分析器、優化器、執行器等,所有跨儲存引擎的功能都在這一層實現,比如儲存過程、觸發器、檢視,函式等,還有乙個通用的日誌模組 binglog日誌模組。
主要負責資料的儲存和讀取,採用可以替換的外掛程式式架構,支援innodb、myisam、memory等多個儲存引擎,其中innodb引擎有自有的日誌模組redolog 模組。
當我們執行一條 sql 更新語句時,你有沒有想過,它的在 mysql 系統內部是如何去執行的?當我們購買 mysql 伺服器時,你有沒有考慮過為什麼 mysql 伺服器記憶體大,硬碟為 ssd 的話比較好?(當然,這是廢話,什麼伺服器,記憶體大,硬碟為 ssd 都好,但 mysql 伺服器要求還是比業務**伺服器要求高些)
以下我們以表 t 的 update sql 為例進行分析(預設innodb引擎):
create table t(id int primary key, c int);
update t set c=c+1 where id=2;
乙個 update 語句的執行邏輯為:
1、通過聯結器連線 mysql server層;
2、聯結器階段初步分析為 update 交給分析器處理;
3、分析器詳細分析 update 語句,進行詞法、語法、語義檢查,生成解析樹以供優化器使用,並在交給優化器之前進行許可權檢查(precheck);
4、優化器將解析樹優化,生成最優執行計畫,交給執行器執行;
5、執行器在執行 sql 時會再次檢查許可權,並呼叫引擎層提供的資料介面,對資料進行更新處理。
更新語句和查詢語句不同之處在於,當我們執行更新時,對資料的敏感性是比較強的,我們需要保證資料更新正確,且萬一的萬一,mysql 崩潰了,我們也能恢復資料,所以更新操作涉及到記錄日誌,這裡的日誌就是我們熟知的 mysql server層 的 binlog日誌 和innodb引擎層的 redolog日誌 。
所以,update時,在上面執行邏輯中的第5步執行器執行階段的處理過程為:
1、執行器取id=2的資料;
2、引擎判斷資料頁是否在記憶體中,沒有則從磁碟讀取到記憶體中,從記憶體中返回行資料;(記憶體大的伺服器的好處)
3、執行器將該資料值加1,之後寫入新行,通知引擎
4、引擎將新資料更新到記憶體中
5、引擎此時開始記錄redolog,並將該記錄置為prepare狀態
6、執行器寫binlog
7、引擎提交事務,並更新此行資料的redolog狀態為commit
8、當mysql空閒時,會將記憶體中的資料落盤。
流程圖:【深色為執行器執行,淺色為引擎處理】
以上就是更新資料時,執行器和引擎做的一系列操作。
整個更新過程其實是awl技術,即write-ahead logging預寫式日誌。先寫日誌,再更新。
我們可能會有疑問:為什麼在binlog存在的情況下,我們還要額外引入redolog呢?
我們詳解之前,先討論下binlog和redolog是什麼。
binlog是mysql server層提供的日誌記錄功能,所有引擎都能用,它是記錄sql執行邏輯的,如給id=2這一行的c欄位+1,且binlog日誌是追加記錄的,當檔案寫到一定大小會新增乙個新檔案繼續記錄,屬於全量日誌。
redolog則是innodb獨有的日誌,其他引擎不可用,且redolog記錄的是在某個資料頁上做了什麼修改,屬於物理日誌,只有innodb才能用,且是固定大小,迴圈記錄的。
現在我們來分析為什麼binlog和redolog並存的問題。
binlog和redolog是通過事件id去關聯的。
簡單來說,binlog和redolog並存可以保證資料一致性,以及意外宕機時的資料恢復問題。也就是mysql的crash-safe。
重做日誌(redo log)、回滾日誌(undo log)、二進位制日誌(binlog),其中,redo log 是物理日誌,undo log 和 binlog 是邏輯日誌,物理日誌的恢復速度遠快於邏輯日誌。
innodb 事務日誌包括 redo log 和 undo log,redo log 是重做日誌,提供前滾操作,undo log 是回滾日誌,提供回滾操作,其中前者保證事務的永續性,後者保證事務的原子性,兩者可以統稱為事務日誌。
redo log:
undo logbinlog 用於主從複製中,從庫利用主庫上的 binlog 進行重播,實現主從同步。用於資料庫的基於時間點、位點等的還原操作。binlog 的模式分三種:statement、row、mixed。
事務提交的時候,一次性將事務中的 sql 語句(乙個事務可能對應多個 sql 語句)按照一定的格式記錄到 binlog 中,這裡與 redo log 很明顯的差異就是 redo log 並不一定是在事務提交的時候才重新整理到磁碟,而是在事務開始之後就開始逐步寫入磁碟。binlog 的預設儲存時間是由引數 expire_logs_days 配置的,對於非活動的日誌檔案,在生成時間超過 expire_logs_days 配置的天數之後,會被自動刪除。
總之,redo log 和 undo log 是保證本地事務的,binlog 是用於主從複製的。
MySQL架構與SQL執行流程
mysql架構設計 下面是一張mysql的架構圖 上方各個元件的含義如下 connectors 指的是不同語言中與sql的互動 management serveices utilities 系統管理和控制工具 connection pool 連線池 管理緩衝使用者連線,執行緒處理等需要快取的需求。負...
01 MySQL架構與執行流程
一 聯結器 在完成經典的 tcp 握手後,聯結器就要開始認證你的身份,這個時候用的就是你輸入的使用者名稱和密碼。如果使用者名稱密碼認證通過,聯結器會到許可權表裡面查出你擁有的許可權。之後,這個連線裡面的許可權判斷邏輯,都將依賴於此時讀到的許可權。這就意味著,乙個使用者成功建立連線後,即使你用管理員賬...
Spark架構與執行流程
1.闡述hadoop生態系統中,hdfs,mapreduce,yarn,hbase及spark的相互關係。2.spark已打造出結構一體化 功能多樣化的大資料生態系統,請簡述spark生態系統。3.用 描述你所理解的spark執行架構,執行流程。4.軟體平台準備 linux hadoop。1.had...