核心狀態變數
mysql> SHOW GLOBAL STATUS LIKE 'qcache%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| Qcache_free_blocks | 22756 |
| Qcache_free_memory | 76764704 |
| Qcache_hits | 213028692 |
| Qcache_inserts | 208894227 |
| Qcache_lowmem_prunes | 4010916 |
| Qcache_not_cached | 13385031 |
| Qcache_queries_in_cache | 43560 |
| Qcache_total_blocks | 111212 |
+-------------------------+-----------+
變數含義與健康度指標
| 變數 | 含義 | 異常徵兆 |
| Qcache_free_blocks | 閒置記憶體區塊數 | 過大 → 碎片嚴重 |
| Qcache_free_memory | 閒置記憶體位元組 | 過小 → 記憶體不足 |
| Qcache_hits | 快取命中次數 | 持續增長為正常 |
| Qcache_inserts | 快取插入次數 | - |
| Qcache_lowmem_prunes | 因記憶體不足淘汰查詢次數 | 持續增長 → 需加大快取或整理碎片 |
| Qcache_not_cached | 不適合快取的查詢數(非 SELECT、含 NOW() 等) | - |
| Qcache_queries_in_cache | 當前快取查詢數 | - |
| Qcache_total_blocks | 總區塊數 | - |
關鍵配置參數
mysql> SHOW VARIABLES LIKE 'query_cache%';
+------------------------------+-----------+
| Variable_name | Value |
+------------------------------+-----------+
| query_cache_limit | 2097152 | -- 單查詢結果超過此大小不快取 (2MB)
| query_cache_min_res_unit | 4096 | -- 快取區塊最小單位 (4KB)
| query_cache_size | 203423744 | -- 快取總大小 (194MB)
| query_cache_type | ON | -- ON/DEMAND/OFF
| query_cache_wlock_invalidate | OFF | -- 寫鎖時是否失效快取
+------------------------------+-----------+
三大核心效率指標計算
-- 碎片率
Qcache_free_blocks / Qcache_total_blocks * 100% -- >20% 需 FLUSH QUERY CACHE 或調小 min_res_unit
-- 利用率
(query_cache_size - Qcache_free_memory) / query_cache_size * 100% -- <25% 過大;>80% 且 lowmem_prunes>50 過小
-- 命中率
(Qcache_hits - Qcache_inserts) / Qcache_hits * 100% -- 範例僅 1.94%,極低,可能寫入頻繁導致快取頻繁失效
調優建議
- 寫入頻繁的表:查詢快取失效極快,建議關閉 (`query_cache_type=OFF`) 或僅對唯讀表啟用 (`DEMAND` + `SQL_CACHE`)。
- 碎片整理:定期 `FLUSH QUERY CACHE` 或重啟服務。
- 區塊大小:小結果集多 → 調小 `query_cache_min_res_unit` (如 1KB);大結果集多 → 調大。
- MySQL 5.7.20+ 已棄用,8.0 移除:新版請改用 Redis/Memcached 等外部快取層。