Query Cache (QC) 將「完全相同的 SQL 文本」與「結果集」快取在記憶體,命中時跳過解析/優化/執行,極速回應。但**任何表異動即失效**,頻繁寫入場景反而拖慢效能。本文完整解析機制、參數、適用性判斷。
SELECT * FROM t ≠ Select * from t (大小寫不同 → 視為不同查詢)。INSERT/UPDATE/DELETE/TRUNCATEALTER TABLE/DROP TABLE/DROP DATABASE→ **頻繁寫入的表完全不適合開啟 QC**,快取命中率極低且維護開銷大。
| 參數 | 預設/範例值 | 說明 |
|---|---|---|
have_query_cache | YES | 是否支援 QC |
query_cache_limit | 1048576 (1MB) | 單一查詢結果最大快取大小 |
query_cache_min_res_unit | 4096 (4KB) | 快取區塊最小單位,影響碎片率 |
query_cache_size | 599040 (~600KB) | **總快取記憶體大小**,0 = 關閉 |
query_cache_type | ON | ON/DEMAND/OFF,DEMAND 需 SQL_CACHE 提示 |
query_cache_wlock_invalidate | OFF | 寫鎖時是否失效快取 |
| 場景 | 建議 |
|---|---|
| 靜態/低頻寫入、高重複查詢 (設定表、字典表、報表快照) | ✅ 開啟 QC,顯著提升 |
| 高頻寫入 (訂單、日誌、計數器) | ❌ 關閉 QC (query_cache_size=0) |
| 大結果集、低重複率 | ❌ 關閉,佔記憶體無效益 |
MySQL 8.0 已**完全移除** Query Cache,建議改用應用層快取 (Redis) 或 ProxySQL 查詢快取。