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

MySQL 查詢快取深度解析:配置參數、狀態監控、失效機制與最佳實踐

     編輯:MySQL 資料庫相關知識

MySQL Query Cache(查詢快取)曾是讀多寫少場景的性能利器,但因鎖競爭嚴重、無法利用多核、8.0 移除等原因,現已淡出主流。本文完整記錄其配置參數、狀態變量、失效觸發條件、監控指標與遷移建議,供維護舊版本(5.6/5.7)系統的 DBA 參考,並說明為何新架構應棄用轉用 Redis/應用層快取。

核心配置參數


SHOW VARIABLES LIKE 'query_cache%';
參數 默認值 說明 建議
query_cache_type OFF (5.7+) 0=關閉, 1=開啟(預設快取), 2=按需(需 SQL_CACHE) 舊版設 1,新版必 0
query_cache_size 0 (5.7+) 快取總記憶體,< 40KB 實際關閉,單位 1024 bytes 對齊 讀多寫少設 64-256MB,寫多設 0
query_cache_limit 1M 單次查詢結果超過此值不快取 根據業務結果集大小調整
query_cache_min_res_unit 4KB 每次分配記憶體最小單位,過大浪費,過小碎片多 4-8KB 適中
query_cache_wlock_invalidate OFF 寫鎖時是否使快取失效 通常 OFF

SQL 級控制


-- 明確不快取
SELECT SQL_NO_CACHE * FROM huge_table;

-- 明確快取(type=2 時生效)
SELECT SQL_CACHE * FROM lookup_table;

狀態監控指標


SHOW STATUS LIKE 'Qcache%';
變量 含義 健康判讀
Qcache_hits 命中次數 持續增長 = 有效
Qcache_inserts 新增快取次數 與 hits 比率 = 命中率
Qcache_not_cached 未快取查詢數(含非 SELECT、超大結果、SQL_NO_CACHE) 過高說明快取覆蓋率低
Qcache_queries_in_cache 當前快取查詢數 穩定在合理範圍
Qcache_free_memory 剩餘可用記憶體 接近 0 需擴容或清理
Qcache_free_blocks 空閒記憶體塊數(碎片指標) 過高 = 碎片嚴重,執行 FLUSH QUERY CACHE
Qcache_lowmem_prunes 因記憶體不足被剔除的查詢數 持續增長 = 記憶體不足,需增大 size
Qcache_total_blocks 總塊數(含查詢文本、結果、表信息) 參考碎片率 = free_blocks / total_blocks

命中率計算


Hit Rate = Qcache_hits / (Qcache_hits + Qcache_inserts + Qcache_not_cached)
-- 理想 > 80%,讀多寫少場景可達 90%+

快取失效觸發條件(關鍵)

以下操作會使**相關表的所有快取條目失效**:

  • INSERT、UPDATE、DELETE、REPLACE
  • TRUNCATE TABLE
  • ALTER TABLE、DROP TABLE、DROP DATABASE
  • GRANT、REVOKE(權限變更)
  • FLUSH TABLES

寫入頻繁的表不適合開啟 Query Cache,每次寫入都要獲取全域鎖遍歷失效相關快取,嚴重阻塞並發。

快取結構與記憶體分配

  • 每個查詢佔用:1 個查詢文本塊 + N 個結果塊(每塊 query_cache_min_res_unit,最後一塊釋放餘量)
  • 每張表首次被快取時,額外佔用 1 個表信息塊
  • 碎片整理:FLUSH QUERY CACHE 整理空閒塊,不清除有效快取;RESET QUERY CACHE 完全清空

為何 8.0 移除 Query Cache?

  1. 全域互斥鎖:任何讀/寫快取操作需持有全域鎖,多核 CPU 利用率極低
  2. 失效開銷大:寫入需掃描並失效所有相關快取,寫入延遲不可控
  3. 命中率低:生產環境常見 < 20%,維護成本 > 收益
  4. 無法快取預存語句:Prepared Statement 不支援
  5. 更好的替代方案:Redis、應用層快取、ProxySQL、物化視圖

遷移建議:從 Query Cache 到現代快取架構

場景 舊方案 新方案
熱點配置/字典表 Query Cache 應用啟動載入本地記憶體 + 定時刷新
會話/用戶資料 Query Cache Redis Cluster(TTL + LRU)
複雜報表聚合 Query Cache 物化視圖 + 定時重建 / ClickHouse OLAP
靜態頁面片段 Query Cache Nginx fastcgi_cache / Varnish / CDN
SQL 結果集複用 Query Cache ProxySQL Query Cache / Vitess / 應用層快取

舊版本(≤5.7)調優清單

  1. 確認 query_cache_type = 1、query_cache_size = 64M-256M
  2. 監控 Qcache_lowmem_prunes = 0,Qcache_free_blocks / Qcache_total_blocks < 0.2
  3. 寫入頻繁表加 SQL_NO_CACHE 或 query_cache_type = 2 按需快取
  4. 定時 FLUSH QUERY CACHE 整理碎片(低峰期)
  5. 避免大結果集快取:設定合理 query_cache_limit

Query Cache 是單機時代的產物,分布式、高併發、多核時代已不適用。維護 5.6/5.7 老系統時做好監控與調優;新架構直接選 Redis/應用層快取/OLAP 引擎,別再糾結 Query Cache 參數調優。

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