mysql 一條sql的執行過程

mysql架構?

  • mysql服務端從架構上分為server層和存儲引擎層:
    • server層:包括連接器,查詢緩存(MySQL 8.0 版本后移除)、分析器、優化器、執行器、binlog日志組件。
    • 存儲引擎:可替換的存儲引擎,其中默認是InnoDB(MySQL 5.5.5 版本開始就被當做默認存儲引擎)存儲引擎,InnoDB自帶一個redo.log日志組件,用于一致性非鎖定讀以及崩潰恢復。

一條sql語句的執行過程?

select:

  1. 連接建立(權限校驗)
  2. 查詢緩存
  3. 分析器(詞法分析:通select等關鍵字進行表名、字段名等提取、語法分析:分析執行語句語法是否錯誤,表及字段是否存在)
  4. 優化器(按照sever認為最優方式優化語句,生成執行計劃,例如索引選擇,多表關聯順序等,但是并不一定是最優的)
  5. 執行器(先校驗權限,例如當前用戶有沒有訪問當前表的權限)
  6. 存儲引擎(調用存儲引擎返回結果)

update:
在select的基礎上:

  1. 執行器
  2. 存儲引擎
  3. 存儲引擎記錄(redo.log:prepare狀態)
  4. 執行器記錄bin.log
  5. redo.log(commit狀態)

為什么 redo.log 要進行兩階段提交?

  • 為了保證數據的一致性,redo.log是進行事務提交用的,而binlog是用于數據備份和同步 。
  • 如果不進行兩階段提交,宕機時可能出現,redo.log或者binlog不存,從而導致數據不一致。
  • 兩階段提交,極端情況下,redo.log是prepare狀態,而binlog記錄完成后宕機,此時就依賴mysql的機制進行處理,當服務重啟后,首先判斷redo.log不是commit狀態,就看binlog,如果binlog完整,則提交事務,否則回滾事務,從而保證數據一致性。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容