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

MySQL Query Cache 機制深度解析與最佳配置策略

     編輯:MySQL 資料庫相關知識

核心機制:Key-Value 精確匹配

  • Key 生成:SQL 文本按字節 Hash(區分大小寫、空格、註釋)
  • Value:結果集完整副本
  • 失效觸發:涉及表的任何 DML/DDL(INSERT/UPDATE/DELETE/TRUNCATE/ALTER/DROP)

結論:僅適合「讀多寫極少」的表(如配置表、字典表、靜態報表)。

配置參數詳解

參數默認值建議值說明
query_cache_typeON (1)DEMAND (2)0=關閉,1=全開,2=按需(需 SQL_CACHE)
query_cache_size0 (關閉)64M-256M總內存上限,需 > 40KB 才啟用
query_cache_limit1M1M-4M單次結果集超過此值不緩存
query_cache_min_res_unit4KB1KB-2KB內存分配最小單元,小結果集調小減少碎片
query_cache_wlock_invalidateOFFOFF寫鎖時是否返回舊緩存

推薦配置模板(my.cnf)

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

應用層協作:顯式控制緩存

-- 明確啟用
SELECT SQL_CACHE id, name FROM config WHERE type='pay';

-- 明確禁用
SELECT SQL_NO_CACHE * FROM orders WHERE user_id=123;

策略:全局 DEMAND + 代碼層 SQL_CACHE,精準控制,避免污染。

監控與調優指標

SHOW STATUS LIKE 'Qcache%';
指標含義健康閾值
Qcache_hits命中次數持續增長
Qcache_inserts寫入次數-
Qcache_hits / (Qcache_hits + Qcache_inserts)命中率> 80%
Qcache_lowmem_prunes內存不足淘汰次數應為 0 或極低
Qcache_free_blocks / Qcache_total_blocks碎片率< 20%
(query_cache_size - Qcache_free_memory) / query_cache_size內存利用率60%-80%

維護操作

  • FLUSH QUERY CACHE:整理碎片,不清除數據
  • RESET QUERY CACHE:清空所有緩存
  • FLUSH TABLES:同步效果等同 RESET

版本演進與替代方案

  • MySQL 5.7.20:標記棄用
  • MySQL 8.0:完全移除
  • 替代方案:
    — 應用層 Redis/Memcached(靈活、分佈式)
    — InnoDB Buffer Pool 預熱(innodb_buffer_pool_dump_at_shutdown)
    — 物化視圖/匯總表預計算

遷移建議

  1. 檢查 Qcache_hits 確認業務依賴程度
  2. 逐步將熱點查詢遷移至 Redis,Key 設計:sql:hash(sql_text)
  3. 關閉 query_cache_type=0、query_cache_size=0 釋放內存給 Buffer Pool
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved