select緩存
『壹』 面試官:select語句和update語句分別是怎麼執行的
深入了解sql執行過程,無論是SELECT還是UPDATE語句,都遵循了類似的流程,但具體實現存在差異。理解這些差異不僅有助於面試,更能優化SQL執行效率。
SELECT語句執行流程
執行SELECT語句時,主要分為以下幾個步驟:
- 連接器: 首先校驗用戶名和密碼,驗證許可權。連接成功後,許可權范圍內的操作才能繼續。
- 檢索緩存: 從緩存中查找是否執行過此SQL,緩存命中直接返回結果,未命中則繼續。
- 分析器: 包括詞法分析和語法分析,確定語句類型和具體操作。
- 優化器: 根據解析樹生成最優執行計劃,考慮使用索引、表關聯順序等。
- 執行器: 執行優化後的計劃,調用存儲引擎讀介面,獲取數據。
UPDATE語句執行流程
執行UPDATE語句時,同樣經過連接器、分析器、優化器、執行器,但區別在於涉及redo log和binlog的操作。
- redo log: 先寫日誌,後更新內存和磁碟,提高效率。
- binlog: 記錄原始SQL,用於數據恢復和復制。
關鍵點
在執行過程中,SELECT和UPDATE的主要區別在於對數據的訪問和修改。同時,使用緩存、優化器、redo log和binlog等功能,可以顯著提升SQL執行效率。理解這些技術的原理和應用,對於提升資料庫性能至關重要。
綜上所述,SELECT和UPDATE語句在執行流程上有相似之處,但在具體操作上存在差異,涉及的數據訪問和修改方式不同。深入理解這些差異,有助於優化SQL查詢和資料庫性能。這一內容涉及的技術點包括緩存機制、SQL解析與優化、日誌系統等,這些都是資料庫管理中不可或缺的組成部分。
『貳』 MyBatis二級緩存帶來的問題
MyBatis二級緩存使用的在某些場景下會出問題,來看一下為什麼這么說。
假設我有一條select語句(開啟了二級緩存):
selecta.col1, a.col2, a.col3, b.col1, b.col2, b.col3fromtableA a, tableB bwherea.id= b.id;
對於tableA與tableB的操作定義在兩個Mapper中,分別叫做MapperA與MapperB,即它們屬於兩個命名空間,如果此時啟用緩存:
MapperA中執行上述sql語句查詢這6個欄位
tableB更新了col1與col2兩個欄位
MapperA再次執行上述sql語句查詢這6個欄位(前提是沒有執行過任何insert、delete、update操作)
此時問題就來了,即使第(2)步tableB更新了col1與col2兩個欄位,第(3)步MapperA走二級緩存查詢到的這6個欄位依然是原來的這6個欄位的值,因為我們從CacheKey的3組條件來看:
<select>標簽所在的Mapper的Namespace+<select>標簽的id屬性
RowBounds的offset和limit屬性,RowBounds是MyBatis用於處理分頁的一個類,offset默認為0,limit默認為Integer.MAX_VALUE
<select>標簽中定義的sql語句
對於MapperA來說,其中的任何一個條件都沒有變化,自然會將原結果返回。
這個問題對於MyBatis的二級緩存來說是一個無解的問題,因此使用MyBatis二級緩存有一個前提: 必須保證所有的增刪改查都在同一個命名空間下才行 。
『叄』 Oracle如何清理多次select查詢後在內存中的緩存數據
ALTER SYSTEM FLUSH SHARED_POOL
這個語句清除SGA中的 shared pool,shared pool存儲下面的信息:
1、數據字典
2、Shared SQL & PL/SQL,存儲過程、函數、包以及觸發器
但是有一點要清楚的是假如這些對象正在使用時是無法清除的。