首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Query Cache 運作機制、配置調校與 8.0 移除遷移指南

     編輯:MySQL 資料庫相關知識

運作原理

  1. Client 發送 SELECT 查詢
  2. Server 計算 SQL 文本 Hash 值,查找 Query Cache Hash Bucket
  3. **命中**:直接返回快取的 Result Set,跳過解析、優化、執行
  4. **未命中**:正常執行流程,結果寫入快取 (若符合條件)
  5. 任何表異動 → 關聯快取**全量失效**

優缺點權衡

優點缺點
重複查詢零開銷回應Hash 計算與查找開銷
應用零修改透明加速頻繁更新表導致快取抖動、失效開銷大
減輕 CPU/IO 壓力Result Set 重複儲存浪費記憶體

適用與不適用場景

  • ✅ **適用**:靜態/半靜態資料、高頻重複查詢、結果集較小、讀多寫極少
  • ❌ **不適用**:頻繁更新表、大結果集、一次性/參數化查詢、含不確定函數 (NOW(), RAND())

SQL Hint 精確控制

SELECT SQL_CACHE id, name FROM static_config WHERE type='A';   -- 強制快取
SELECT SQL_NO_CACHE * FROM orders WHERE user_id=123;           -- 強制不快取

系統參數配置

參數預設建議
query_cache_typeON (1)**DEMAND (2)** + SQL Hint 控制
query_cache_size0 (關閉)64MB-512MB 視重複查詢比例
query_cache_limit1MB單查詢結果上限,大報表調大
query_cache_min_res_unit4KB小結果集調小 (1KB),大結果集調大 (32KB)
query_cache_wlock_invalidateOFF保持 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

MySQL 8.0 移除 Query Cache - 遷移指南

原因:單一全域鎖成為高並發瓶頸、無法受惠多核、維護成本高、應用層快取更靈活。

遷移路徑

  1. 應用層快取 (推薦):Redis Cluster / Memcached / Caffeine (JVM 內存)
  2. Proxy 層快取:ProxySQL Query Cache、MySQL Router
  3. 資料庫層替代:
    • Materialized View (物化視圖) - 手動維護
    • Summary Table (匯總表) - 定時任務刷新
    • Generated Column + Index - 特定查詢加速

遷移檢查清單

  • 識別所有使用 `SQL_CACHE` 的查詢
  • 評估快取命中率、資料更新頻率、結果集大小
  • 選擇遷移方案並實作
  • 影子表/雙寫驗證一致性
  • 灰度釋出、監控 QPS/延遲/錯誤率
  • 完全切換後移除 `query_cache_size` 配置

總結

Query Cache 是 MySQL 早期為「單核、讀多寫少、應用無快取能力」設計的產物。現代架構下,**應用層快取 (Redis) 為主流選擇**,資料庫層專注核心儲存與查詢引擎優化。MySQL 8.0 移除是順應時代的必然。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved