運作原理
- 針對
SELECT 語句,以 **SQL 文本為 Key** 經 Hash 運算存入 Hash Bucket
- Value 為 **Result Set (結果集)** 存放於記憶體快取區
- 節點同時記錄:涉及的表標識、結果集記憶體位址
- 任何表資料異動 (INSERT/UPDATE/DELETE/TRUNCATE/ALTER) 觸發相關快取**全量失效**
關鍵特性與限制
- 精確匹配:大小寫、空格、註解差異視為不同 Key (建議統一 SQL 格式規範)
- 不支援:
SHOW、USE、PREPARE、存儲函數、用戶變量、臨時表、系統表查詢
- 頻繁更新表慎用:快取失效頻率高會增加管理開銷,反而拖慢效能
- 大結果集風險:單查詢結果超過
query_cache_limit (預設 1MB) 不快取
SQL Hint 控制
SELECT SQL_CACHE ...:強制快取 (需 query_cache_type=2)
SELECT SQL_NO_CACHE ...:強制不快取 (適用頻繁更新表、大結果集、一次性查詢)
記憶體管理:存儲塊
- 結果集分塊存儲,塊大小由
query_cache_min_res_unit 控制 (預設 4KB)
- 最後一塊未滿釋放剩餘空間
- 塊過小 → 分配頻繁、碎片多;塊過大 → 內部碎片浪費
核心配置參數
| 參數 | 說明 | 建議 |
query_cache_type | 0=關閉, 1=開啟(預設), 2=按需 | 生產環境建議 2 (按需),配合 SQL Hint |
query_cache_size | 總記憶體配額 (0=關閉) | 視重複查詢比例調整,典型 64MB-512MB |
query_cache_limit | 單查詢最大快取大小 | 預設 1MB,大報表查詢可調大 |
query_cache_min_res_unit | 分配塊最小單位 | 小結果集多調小 (1KB),大結果集調大 (16-32KB) |
query_cache_wlock_invalidate | 寫鎖時是否返回快取 | 通常 OFF,避免髒讀 |
狀態監控指標
SHOW STATUS LIKE 'Qcache%';
| 指標 | 含義 | 健康判讀 |
Qcache_hits | 命中次數 | 越高越好 |
Qcache_inserts | 插入次數 (未命中) | -- |
Qcache_hits / (Qcache_hits + Qcache_inserts) | **命中率** | > 80% 為佳,< 20% 考慮關閉 |
Qcache_lowmem_prunes | 因記憶體不足被淘汰次數 | 持續增長 → 調大 size 或調小 min_res_unit |
Qcache_free_blocks / Qcache_total_blocks | **碎片率** | > 20% 執行 FLUSH QUERY CACHE |
(query_cache_size - Qcache_free_memory) / query_cache_size | **記憶體利用率** | 25%-80% 區間為健康 |
最佳實務總結
- **按需啟用** (
query_cache_type=2) + SQL_CACHE 針對靜態/半靜態查詢
- 頻繁更新表、大結果集、一次性查詢 →
SQL_NO_CACHE
- 監控命中率與碎片率,定期
FLUSH QUERY CACHE 整理
- MySQL 5.7+ 官方已棄用,8.0 移除,**新專案建議改用 Redis/Memcached 應用層快取**