查詢緩存能將重複 SELECT 結果直接從記憶體返回,大幅降低 CPU 與 I/O。本文以實操指令示範緩存的啟停、參數檢視、碎片整理、清除與效能監控關鍵指標。
-- 檢視當前模式
SELECT @@query_cache_type; -- ON / OFF / DEMAND
-- 關閉緩存
SET GLOBAL query_cache_type = OFF;
-- 開啟緩存
SET GLOBAL query_cache_type = ON;
-- 單句控制:強制使用/不使用緩存
SELECT SQL_CACHE id, title FROM article;
SELECT SQL_NO_CACHE id, title FROM article;
-- 是否支援緩存
SHOW VARIABLES LIKE 'have_query_cache'; -- YES
-- 緩存總大小(Bytes)
SELECT @@global.query_cache_size; -- 16777216 (16MB)
-- 單查詢最大緩存限制
SELECT @@global.query_cache_limit; -- 1048576 (1MB)
-- 碎片整理(不清除資料,僅合併記憶體塊)
FLUSH QUERY CACHE;
-- 完全清除緩存
RESET QUERY CACHE;
FLUSH TABLES; -- 確保狀態最新
SHOW STATUS LIKE 'Qcache%';
| 變數 | 含義 | 健康判讀 |
|---|---|---|
| Qcache_free_blocks | 空閒記憶體塊數 | 過大表示碎片嚴重 |
| Qcache_free_memory | 剩餘可用記憶體 | 過低需擴充 query_cache_size |
| Qcache_hits | 命中次數 | 核心效能指標 |
| Qcache_inserts | 寫入緩存次數 | 配合 hits 計算命中率 |
| Qcache_lowmem_prunes | 因記憶體不足被淘汰次數 | >0 持續增長需加大緩存 |
| Qcache_not_cached | 未緩存查詢數 | 含非 SELECT、使用 NOW() 等 |
| Qcache_queries_in_cache | 當前緩存查詢數 | 觀察緩存利用度 |
| Qcache_total_blocks | 總記憶體塊數 | 配合 free_blocks 算碎片率 |
FLUSH QUERY CACHE 或降低 query_cache_min_res_unit-- 觀察緩存新增
SELECT SQL_CACHE id, title FROM article;
SHOW STATUS LIKE 'Qcache_queries_in_cache'; -- 0 → 1
-- 觀察記憶體消耗
SHOW STATUS LIKE 'Qcache_free_memory'; -- 16768408 → 16766728
查詢緩存對「讀多寫少、重複查詢多」場景效果顯著;寫入頻繁會導致頻繁失效,需權衡啟用。