SELECT 查詢| 優點 | 缺點 |
|---|---|
| 重複查詢零開銷回應 | Hash 計算與查找開銷 |
| 應用零修改透明加速 | 頻繁更新表導致快取抖動、失效開銷大 |
| 減輕 CPU/IO 壓力 | Result Set 重複儲存浪費記憶體 |
NOW(), RAND())SELECT SQL_CACHE id, name FROM static_config WHERE type='A'; -- 強制快取
SELECT SQL_NO_CACHE * FROM orders WHERE user_id=123; -- 強制不快取
| 參數 | 預設 | 建議 |
|---|---|---|
query_cache_type | ON (1) | **DEMAND (2)** + SQL Hint 控制 |
query_cache_size | 0 (關閉) | 64MB-512MB 視重複查詢比例 |
query_cache_limit | 1MB | 單查詢結果上限,大報表調大 |
query_cache_min_res_unit | 4KB | 小結果集調小 (1KB),大結果集調大 (32KB) |
query_cache_wlock_invalidate | OFF | 保持 OFF 避免髒讀 |
-- 命中率
Qcache_hits / (Qcache_hits + Qcache_inserts)
-- 碎片率
Qcache_free_blocks / Qcache_total_blocks -- > 20% 需 FLUSH QUERY CACHE
-- 記憶體利用率
(query_cache_size - Qcache_free_memory) / query_cache_size -- 25-80% 健康
-- 記憶體壓力
Qcache_lowmem_prunes 持續增長 → 調大 size 或調小 min_res_unit
原因:單一全域鎖成為高並發瓶頸、無法受惠多核、維護成本高、應用層快取更靈活。
Query Cache 是 MySQL 早期為「單核、讀多寫少、應用無快取能力」設計的產物。現代架構下,**應用層快取 (Redis) 為主流選擇**,資料庫層專注核心儲存與查詢引擎優化。MySQL 8.0 移除是順應時代的必然。