查詢緩存 (Query Cache) 在讀多寫少場景極具效能杠桿。本文完整解析 6 大配置變數、9 大狀態指標、3 核心健康度公式與調優實戰案例,助力精準調優。
| 變數 | 預設 | 說明 | 調優建議 |
|---|---|---|---|
| have_query_cache | YES | 編譯支援標記 | 不可修改 |
| query_cache_type | ON | 模式:OFF/ON/DEMAND | DEMAND 配合 SQL_CACHE 精準控制 |
| query_cache_size | 0 (關閉) | 總記憶體 (Bytes),0=禁用 | 依命中率與利用率動態調整 |
| query_cache_limit | 1MB | 單查詢結果最大緩存體積 | 大結果集場景適度調大 |
| query_cache_min_res_unit | 4KB | 記憶體分配最小單元 | 小查詢多→調小 (2KB);大查詢多→調大 |
| query_cache_wlock_invalidate | OFF | MyISAM 寫鎖時是否失效緩存 | 寫入頻繁可開啟減少髒讀 |
| 指標 | 含義 | 健康判讀 |
|---|---|---|
| Qcache_free_blocks | 空閒記憶體塊數 | 過大 = 碎片嚴重 |
| Qcache_free_memory | 剩餘可用記憶體 | 過低 = 需擴充 size |
| Qcache_hits | 命中次數 | 核心效能指標 |
| Qcache_inserts | 寫入緩存次數 | 分母 |
| Qcache_lowmem_prunes | 因記憶體不足被淘汰次數 | 持續增長 = 記憶體不足或碎片多 |
| Qcache_not_cached | 未緩存查詢數 | 非 SELECT、含 NOW()、超過 limit 等 |
| Qcache_queries_in_cache | 當前緩存查詢數 | 利用度參考 |
| Qcache_total_blocks | 總記憶體塊數 | 分母 |
FLUSH QUERY CACHE 或降低 query_cache_min_res_unit參考《High Performance MySQL》:
query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
動態計算平均每查詢佔用記憶體,作為分配單元基準。
-- 初始狀態
Qcache_free_blocks=4984, Qcache_total_blocks=46362 → 碎片率 10.7%
Qcache_free_memory=30097400, query_cache_size=67108864 → 利用率 55.2%
Qcache_hits=701669, Qcache_inserts=832414 → 命中率 45.8%
-- 調整 min_res_unit 4096→2048
碎片率 10.7% → 3.2% (顯著改善)
但過小增加 IO 開銷,需平衡
FLUSH QUERY CACHE; -- 整理碎片,不清除資料
RESET QUERY CACHE; -- 完全清空緩存
查詢緩存是雙刃劍:精準配置可獲 10 倍提升,誤用反拖累效能。持續監控三大指標,動態平衡。