一、一條sql的執行過程
APP(客戶端)
↓↓
查詢緩存
可以提高效率,但sql不完全一樣時即失效。表內容變化時也失效。因此最好還是ORM框架去實現。
MYSQL的查詢緩存默認關閉,8.0的版本以後已經去除該緩存模塊。
↓↓
解析器
對sql進行詞法解析,語法解析。判斷是否正確
↓↓
預處理器
檢查表是否存在,列是否存在
↓↓
查詢優化器
執行前對sql進行優化,生成執行計劃
查詢優化器追蹤:
↓↓
查詢執行引擎
由其獲得執行計劃去操作存儲引擎
↓↓
存儲引擎
數據存放在什麼結構裏,由存儲引擎決定。
每個表都可以有不同的存儲引擎。
查看錶的存儲引擎: show table status from `tablename`;
執行流程整體圖:
二、存儲引擎
5.5版本以前默認MyISAM,之後默認InnoDB
MyISAM只支持表級別的鎖,插入和查詢的操作效率高,不支持事物,不支持外鍵。
InnoDB支持事物和外鍵,支持行鎖,因此數據完整性較高。數據一致性要求高,比較多更新操作適用,
Memory數據存放在內存中,讀寫數據快,如果需要臨時存儲數據適用。
CSV表體積較小,適用於遷移,不支持索引。
InnoDB的結構
BufferPoor:寫入磁盤前先走BP,提升讀寫效率
RedoLog:先寫日誌,再把數據從內存同步到磁盤中
僅在InnoDB中實現,可用於崩潰恢復
UndoLog:innodb實現事物原子性和回滾操作的日誌文件
binlog:server層的邏輯日誌各存儲引擎都能使用。用來做主從,做數據恢復。
三、一條更新語句的執行流程