萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL Query Cache 深度解析:原理、配置、監控與避坑指南

⚠️ 重要提示

MySQL 8.0 已移除 Query Cache。 本文適用於 MySQL 5.7 及之前版本。新版本請使用 準備語句緩存、Redis/ProxySQL 等外部緩存 方案。

工作原理

  1. SQL 文本標準化:去除首尾空白、註釋,大小寫敏感
  2. 哈希查找:query_cache_size 內存區按哈希表組織
  3. 命中 → 直接返回結果集(繞過解析、優化、執行)
  4. 未命中 → 正常執行,結果寫入緩存(受 query_cache_limit 限制)
  5. 表級失效:任意 DML(INSERT/UPDATE/DELETE/TRUNCATE)觸發相關表所有緩存失效

關鍵配置參數

推薦配置模板

[mysqld]
query_cache_type = 2
query_cache_size = 128M
query_cache_limit = 2M
query_cache_min_res_unit = 2K
query_cache_wlock_invalidate = ON

監控指標解讀

SHOW STATUS LIKE 'Qcache%';
參數默認值建議值說明
query_cache_typeON (1)DEMAND (2)0=關閉, 1=全開, 2=按需(SQL_CACHE)
query_cache_size0 (關閉)64M-256M總內存,< 40KB 實際關閉,1024 字節對齊
query_cache_limit1M1M-4M單個結果集上限,超過不緩存
query_cache_min_res_unit4KB1KB-8KB結果集分配塊大小,影響碎片
query_cache_wlock_invalidateOFFON寫鎖時是否失效緩存
指標含義健康判斷
Qcache_hits命中次數持續增長為好
Qcache_inserts新增緩存數與 hits 比值反映命中率
Qcache_lowmem_prunes因內存不足清理數快速增長 → 擴大 size 或縮小 min_res_unit
Qcache_free_memory剩餘內存長期 < 10% → 擴容
Qcache_queries_in_cache當前緩存查詢數配合 total_blocks 計算平均塊數
Qcache_total_blocks總塊數blocks/queries ≈ 2 為佳;>>2 説明碎片嚴重
Qcache_free_blocks空閒塊數過多說明碎片,執行 FLUSH QUERY CACHE 整理

命中率計算

Hit Ratio = Qcache_hits / (Qcache_hits + Qcache_inserts + Qcache_not_cached)
-- 目標 > 80% 為優秀

調優實戰

場景 1:碎片過多

-- 現象:Qcache_total_blocks / Qcache_queries_in_cache > 5
-- 對策:增大 min_res_unit
SET GLOBAL query_cache_min_res_unit = 8192;  -- 8KB
FLUSH QUERY CACHE;

場景 2:內存壓力大

-- 現象:Qcache_lowmem_prunes 快速增長
-- 對策:增大 size 或啟用按需模式
SET GLOBAL query_cache_size = 256M;
-- 或
SET GLOBAL query_cache_type = 2;  -- 需 SQL_CACHE 顯式啟用

場景 3:頻繁更新表污染緩存

-- 對高頻更新表的查詢禁用緩存
SELECT SQL_NO_CACHE * FROM high_freq_table WHERE ...;

-- 或表級禁用(MySQL 5.7+)
ALTER TABLE high_freq_table QUERY_CACHE = 0;  -- 需 enterprise 版

何時不應使用 Query Cache

  • 寫入頻繁的表(失效開銷 > 命中收益)
  • 大結果集查詢(超過 query_cache_limit)
  • 高併發獨特查詢(如用戶登錄驗證,每條 SQL 唯一)
  • 非決定性函數(NOW(), RAND(), UUID())
  • 使用 SQL_CALC_FOUND_ROWS、FOUND_ROWS() 的查詢
  • 涉及系統表、臨時表、用戶定義函數的查詢

遷移建議(MySQL 8.0+)

  1. 應用層緩存:Redis/Memcached 緩存熱點查詢結果,TTL 可控
  2. ProxySQL:中間件層查詢緩存,支持多後端、規則路由
  3. Prepared Statement:複用執行計劃,減少解析優化開銷
  4. 物化視圖/摘要表:定時刷新聚合結果,替代實時複雜查詢

總結

Query Cache 在「讀多寫少、查詢重複度高、結果集小」場景下極其有效,但隨著寫入比例上升,維護成本指數級增長。MySQL 8.0 移除它是順應架構演進的必然。現代架構應將緩存下沉到應用層或專用中間件,實現更精細的控制與水平擴展。

copyright © 萬盛學電腦網 all rights reserved