這是我參與更文挑戰的第28天,活動詳情查看: 更文挑戰mysql
當打開某一個數據庫客戶端,鏈接數據庫,輸入一條SQL語句,點擊執行後輸出其結果。執行的過程當中,發生了什麼?sql
客戶端與 MySQL 的交互過程的原理圖,以下圖所示。數據庫
![CgotOV14ySKAMxohAAH2VHcAzkE612.png](http://static.javashuo.com/static/loading.gif)
查詢語句的軌跡
一條查詢語句的軌跡是怎麼樣的?緩存
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