從 MySQL 4.0.1 版本開始,MySQL Server 引入了重要特性:Query Cache(查詢快取)。當啟用時,查詢快取會儲存 SELECT 查詢的文本內容以及傳送給客戶端的對應結果。若後續收到完全相同的查詢,伺服器將直接從快取中取回結果,而非重新解析並執行查詢,從而大幅提升效能。
注意:查詢快取絕不會返回過期資料。當資料被修改後,快取中所有相關條目都會被立即清除失效。
在資料表不常變更,但須執行大量相同查詢的場景下,查詢快取極具價值。這對於大量使用動態資訊的 Web 伺服器而言,是典型應用場景。
以下測試在 Linux Alpha 2×500 MHz、2GB RAM、64MB 查詢快取環境下執行 MySQL 基準套件所得:
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 節。