首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 查詢快取機制深度解析

     編輯:MySQL 資料庫相關知識

MySQL 查詢快取概述

從 MySQL 4.0.1 版本開始,MySQL Server 引入了重要特性:Query Cache(查詢快取)。當啟用時,查詢快取會儲存 SELECT 查詢的文本內容以及傳送給客戶端的對應結果。若後續收到完全相同的查詢,伺服器將直接從快取中取回結果,而非重新解析並執行查詢,從而大幅提升效能。

注意:查詢快取絕不會返回過期資料。當資料被修改後,快取中所有相關條目都會被立即清除失效。

在資料表不常變更,但須執行大量相同查詢的場景下,查詢快取極具價值。這對於大量使用動態資訊的 Web 伺服器而言,是典型應用場景。

效能基準測試數據

以下測試在 Linux Alpha 2×500 MHz、2GB RAM、64MB 查詢快取環境下執行 MySQL 基準套件所得:

  • 最差情況:所有查詢均為簡單查詢(如逐行選取)且互不相同,無法被快取。查詢快取啟用時開銷約 13%。實際應用中查詢通常更複雜,開銷顯著更低。
  • 最佳加速:在單行記錄表中搜尋單行,速度提升 238%,接近快取查詢的理論最小加速比。
  • 停用快取:設定 query_cache_size=0 可禁用查詢快取,此時無明顯開銷。編譯時加入 --without-query-cache 可徹底移除快取程式碼。

查詢快取運作原理

查詢比對機制

查詢在解析前即進行比對,因此大小寫、空格差異會導致視為不同查詢:

SELECT * FROM tbl_name
Select * from tbl_name

查詢必須位元級完全一致才視為相同。此外,不同通訊協定格式、字元集、預設資料庫的查詢也會分別快取。

不支援快取的查詢類型

  • 包含 SQL_CALC_FOUND_ROWS 或 FOUND_ROWS() 的查詢
  • 使用者自訂函數、CONNECTION_ID()、FOUND_ROWS()、GET_LOCK()、RELEASE_LOCK()、LOAD_FILE()、MASTER_POS_WAIT()、NOW()、SYSDATE()、CURRENT_TIMESTAMP()、CURDATE()、CURRENT_DATE()、CURTIME()、CURRENT_TIME()、DATABASE()、ENCRYPT()(單參數)、LAST_INSERT_ID()、RAND()、UNIX_TIMESTAMP()(無參數)、USER()、BENCHMARK() 等不確定性函數
  • 包含使用者變數、引用 mysql 系統資料庫
  • SELECT ... IN SHARE MODE、SELECT ... INTO OUTFILE ...、SELECT ... INTO DUMPFILE ...、SELECT * FROM ... WHERE auto_increment_col IS NULL(ODBC 取得最後插入 ID)

快取失效機制

當資料表發生 INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE|DATABASE 等變更,所有使用該表的快取查詢(含經由 MRG_MyISAM 表)即失效並移除。InnoDB 表的事務變更在 COMMIT 完成時使快取失效。

狀態變數監控

快取命中時 Com_select 不增加,但 Qcache_hits 遞增。詳細狀態維護請參閱 6.9.4 節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved