MySQL篇|02一條SQL執行的歷程

這是我參與更文挑戰的第28天,活動詳情查看: 更文挑戰mysql

當打開某一個數據庫客戶端,鏈接數據庫,輸入一條SQL語句,點擊執行後輸出其結果。執行的過程當中,發生了什麼?sql

客戶端與 MySQL 的交互過程的原理圖,以下圖所示。數據庫

CgotOV14ySKAMxohAAH2VHcAzkE612.png

查詢語句的軌跡

一條查詢語句的軌跡是怎麼樣的?緩存

select id from bas_student;
複製代碼
  • 客戶端經過MySQL的Client Connection創建鏈接
  • 查詢緩存。前提是開啓查詢緩存功能。開啓了,在查詢緩存過程當中查詢到徹底相同的SQL語句時將查詢結果直接返回給客戶端,未開啓或未查到數據則進入下一步
  • 前提是未開啓查詢緩存或開啓了卻沒查到數據,進入解析器進行語法語義解析,生成解析樹
  • 預處理器生成新的解析樹
  • 查詢優化器生成執行計劃,其實就是選擇最優的查詢路徑
  • 查詢執行引擎執行SQL語句,經過執行器組件去執行,其根據執行計劃,調用存儲引擎的各類接口去執行SQL語句,查詢到數據後不只把結果返回給客戶端,也將結果保存到查詢緩存中

更新語句的軌跡

一條更新語句的軌跡時怎麼樣?markdown

update bas_student set name = 'jasen' where id= 2021;
複製代碼

和查詢語句的執行軌跡基本一致,但更新語句會涉及兩個重要的日誌模:redo log 重作日誌 和 bin log 歸檔日誌。post

  • redo log prepare
    • 存儲引擎將新記錄更新到內存中,並將這個操做記錄到redo log中,此時redo log 處於prepare狀態,隨時能夠提交事務。
  • bin log
    • 執行器生成操做的bin log 並將bin log寫入磁盤
  • redo log commit
    • 執行期調用引擎提交事務的接口,將redo log 狀態改成commit

擴展

查詢緩存功能很薄弱,MySQL8.0已廢棄查詢緩存功能優化

若是開啓查詢緩存,SQL語句必須徹底都一摸同樣,才能查到該結果,對於更新語句一摸同樣的數據會比較少,且對於表中的數據若是更新了,該表的緩存也會失效。spa

相關文章
相關標籤/搜索