數據庫的緩存 -- 通過將數據庫中的數據或結果集保存在內存或其他快速訪問的介質中,能夠加快查詢響應,減少對磁盤或遠程服務器的訪問,降低資源消耗。
根據緩存的位置、內容、粒度、更新方式等不同,數據庫緩存技術有多種類型和策略。常用的以下10種:
1、Buffer Pool:
數據頁緩存 -- 將頻繁訪問的數據頁緩存在內存中的技術,可以提高查詢性能和減少磁盤I/O。數據頁是數據庫中存儲數據的最小單位,通常為4KB或8KB。當查詢需要訪問某個數據頁時,數據庫會先檢查該數據頁是否已經在Buffer Pool中,如果是,則直接從內存中讀取,如果不是,則從磁盤中讀取并放入Buffer Pool中。Buffer Pool的大小可以根據系統資源和數據庫負載進行調整。
2、查詢緩存( Query cache ):
緩存經常重復的查詢結果,避免重復執行SQL,可以節省CPU資源和網絡帶寬。當查詢緩存開啟時,數據庫會將每個查詢的SQL語句和結果集保存在內存中,當收到相同的SQL語句時,數據庫會直接返回緩存的結果集,而不需要再次執行SQL。查詢緩存的有效性依賴于表的更新頻率,如果表經常被修改,則查詢緩存會失效并需要重新生成。
3、預讀 ( Pre-fetching ):
根據數據庫的訪問模式,預先緩存可能使用的數據,是一種提高查詢性能和預防磁盤I/O瓶頸的技術。預讀有兩種類型:順序預讀和隨機預讀。順序預讀是指當數據庫檢測到連續訪問相鄰數據頁時,會提前從磁盤中讀取后續的數據頁并放入Buffer Pool中,以滿足后續的查詢需求。隨機預讀是指當數據庫檢測到頻繁訪問某些索引頁時,會提前從磁盤中讀取相關的數據頁并放入Buffer Pool中,以加速索引查找。
4、異步I/O ( Asynchronous I/O ):
允許多個查詢并發訪問緩存,是提高數據庫吞吐量和響應時間的技術。當數據庫需要從磁盤中讀取或寫入數據時,不阻塞當前的查詢進程,而是將I/O請求交給系統處理,并繼續執行其他查詢或操作。這樣避免查詢等待I/O完成而浪費CPU資源,并可以充分利用系統的I/O調度算法和硬件特性。
5、連接池 ( Connection Pool ):
復用已存在連接的技術。避免連接反復創建、銷毀,減少連接開銷,提高連接效率。由數據庫服務器維護一組已經建立好的連接,并將其保存在內存中。當客戶端請示連接數據庫時,數據庫服務器從連接池中分配一個空閑的連接給客戶端,并在客戶端斷開連接后將連接回收到連接池中。避免了每次都重新建立和銷毀連接所帶來的時間和資源消耗,并且可以控制并發連接數量。
6、照合緩存 ( Metadata Cache ):
為了加速表掃描和索引查找,緩存經常訪問表的元數據信息的一種緩存技術。照合緩存是將每個表的結構、列、索引、約束等信息保存在內存中,并在收到對該表的查詢時直接從內存中獲取這些信息,而不需要再次從系統表中讀取。這樣可以減少對系統表的訪問次數,快速確定查詢計劃。
7、Write Ahead Log:
事務提交前先寫入日志,可以保證事務的持久性和原子性。Write Ahead Log是當數據庫執行一個事務時,并不是立即將事務對數據的修改寫入磁盤,而是先將事務的操作記錄寫入日志文件中,在事務提交時將日志文件刷新到磁盤。這樣可以避免頻繁的數據寫入操作,并且可以在數據庫崩潰時根據日志文件恢復數據的一致性。
8、事務日志( Transaction Log ):
記錄事務執行情況,用于數據庫恢復。事務日志是數據庫服務器將每個事務的開始、結束、提交、回滾等信息記錄在日志文件中,并在數據庫崩潰時根據這些信息恢復事務的狀態。可以保證事務的完整性和隔離性,避免數據丟失或臟讀。
9、復制日志( Replication Log ):
主從復制時的數據同步日志。復制日志是當數據庫服務器作為主服務器時,將自己對數據的修改記錄在日志文件中,并將日志文件發送給從服務器,從服務器則根據日志文件更新自己的數據。這樣可以實現主從之間的數據一致性,并且可以在主服務器故障時切換到從服務器繼續提供服務。
10、物化視圖 ( Materialized View ):
將查詢結果緩存,是一種避免重復計算的技術。物化視圖是數據庫服務器將某個復雜查詢的結果集保存在一個表中,并定期更新這個表。當收到相同或類似的查詢時,數據庫服務器會直接從物化視圖中返回結果,而不需執行復雜查詢。