mysql架構?
- mysql服務端從架構上分為server層和存儲引擎層:
- server層:包括連接器,查詢緩存(MySQL 8.0 版本后移除)、分析器、優化器、執行器、binlog日志組件。
- 存儲引擎:可替換的存儲引擎,其中默認是InnoDB(MySQL 5.5.5 版本開始就被當做默認存儲引擎)存儲引擎,InnoDB自帶一個redo.log日志組件,用于一致性非鎖定讀以及崩潰恢復。
一條sql語句的執行過程?
select:
- 連接建立(權限校驗)
- 查詢緩存
- 分析器(詞法分析:通select等關鍵字進行表名、字段名等提取、語法分析:分析執行語句語法是否錯誤,表及字段是否存在)
- 優化器(按照sever認為最優方式優化語句,生成執行計劃,例如索引選擇,多表關聯順序等,但是并不一定是最優的)
- 執行器(先校驗權限,例如當前用戶有沒有訪問當前表的權限)
- 存儲引擎(調用存儲引擎返回結果)
update:
在select的基礎上:
- 執行器
- 存儲引擎
- 存儲引擎記錄(redo.log:prepare狀態)
- 執行器記錄bin.log
- redo.log(commit狀態)
為什么 redo.log 要進行兩階段提交?
- 為了保證數據的一致性,redo.log是進行事務提交用的,而binlog是用于數據備份和同步 。
- 如果不進行兩階段提交,宕機時可能出現,redo.log或者binlog不存,從而導致數據不一致。
- 兩階段提交,極端情況下,redo.log是prepare狀態,而binlog記錄完成后宕機,此時就依賴mysql的機制進行處理,當服務重啟后,首先判斷redo.log不是commit狀態,就看binlog,如果binlog完整,則提交事務,否則回滾事務,從而保證數據一致性。