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

MySQL 查詢緩存配置與適用場景:query_cache 參數詳解

     編輯:MySQL 資料庫相關知識

MySQL Query Cache 配置指南:參數、原理、適用場景與廢棄說明

查詢緩存將 SELECT 文本與結果集鍵值對存儲,命中時直接返回,避免解析、優化、執行。注意:MySQL 5.7.20 棄用,8.0 移除,生產環境建議遷移至應用層緩存。本文供存量系統維護參考。

一、核心配置參數 (my.cnf [mysqld])


query_cache_type = 1          # 0=關閉 1=開啟(默認) 2=DEMAND模式
query_cache_size = 64M        # 緩存總內存,0 表示關閉
query_cache_limit = 1M        # 單條結果集最大緩存大小
query_cache_min_res_unit = 4K # 分配最小塊(減少碎片)

修改後:systemctl restart mysqld。

二、運行狀態監控


SHOW STATUS LIKE 'Qcache%';
變量含義健康判斷
Qcache_free_memory剩餘可用內存過小需增大 query_cache_size
Qcache_hits命中次數越高越好,命中率 = hits/(hits+inserts)
Qcache_inserts插入緩存次數
Qcache_lowmem_prunes因內存不足被剔除次數頻繁增大說明容量不足
Qcache_not_cached未緩存查詢數含非 SELECT、含不確定函數、超大結果
Qcache_queries_in_cache當前緩存查詢數
Qcache_free_blocks / Qcache_total_blocks碎片程度free_blocks 佔比高說明碎片多

三、查詢緩存失效條件(不緩存/自動失效)

  • 非 SELECT 語句
  • 包含不確定函數:NOW()、RAND()、UUID()、USER()、CONNECTION_ID() 等
  • 涉及系統表 / mysql 庫 / 臨時表 / 分區表
  • 結果集大於 query_cache_limit
  • SQL_NO_CACHE 提示:SELECT SQL_NO_CACHE * FROM t
  • 表數據變更(INSERT/UPDATE/DELETE/TRUNCATE/ALTER)→ 相關緩存全部失效

四、適用與不適用場景

場景建議理由
讀多寫少、重複查詢高(配置表、字典表、報表)✅ 開啟命中率高,收益大於失效開銷
寫入頻繁(訂單、日誌、計數器)❌ 關閉頻繁失效導致鎖競爭、CPU 浪費
大結果集、非重複查詢❌ 關閉佔用內存、無命中
高併發寫入表❌ 關閉全局鎖成為瓶頸

五、SQL 級控制


SELECT SQL_CACHE * FROM t;      -- 明確緩存 (type=2 時生效)
SELECT SQL_NO_CACHE * FROM t;   -- 明確不緩存

六、遷移建議(5.7/8.0+)

  1. 應用層引入 Redis / Memcached / Caffeine 等緩存中間件。
  2. 讀寫分離架構:主庫寫、從庫讀,從庫可開啟 query_cache(只讀無失效開銷)。
  3. 物化視圖 / 彙總表預計算,替代重複聚合查詢。
  4. 啟用 query_cache_type=0 並設置 query_cache_size=0 徹底關閉。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved