Query Cache 內部原理與生產環境調優實戰
適用版本:MySQL 5.7 及以前(8.0 已移除)。理解其 Key 生成、失效、碎片機制,能做出精準配置決策。
Key 生成原理
- 對
SELECT 文本按固定 Hash 算法生成 Key,區分大小寫、空格、註釋。
- 兩條語句必須逐字元完全一致(含大小寫、縮進)才命中同一緩存。
- Value 為結果集數據 + 元數據。
失效機制:極其激進
涉及表發生 任何寫入 (INSERT/UPDATE/DELETE/TRUNCATE/ALTER/DROP) → 該表相關所有緩存條目立即失效。
結論:高寫入頻表嚴禁開啟 Query Cache,否則失效開銷 > 命中收益。
適用場景判斷
| 表特徵 | 建議 |
| 讀多寫極少(配置表、字典表、靜態報表) | ✅ 開啟 |
| 讀寫混合、頻繁更新 | ❌ 關閉 |
| 大結果集、低複用率 | ❌ 關閉 |
配置策略:按需啟用 (DEMAND) + 顯式控制
-- my.cnf
query_cache_type = 2 -- DEMAND 模式
query_cache_size = 64M -- 視機器記憶體
query_cache_limit = 2M -- 單結果集上限
應用層 SQL 顯式聲明:
-- 需緩存
SELECT SQL_CACHE * FROM config_table WHERE type='system';
-- 不緩存
SELECT SQL_NO_CACHE * FROM order_table WHERE user_id=123;
調試與監控命令
-- 查看配置
SHOW VARIABLES LIKE '%query_cache%';
-- 即時狀態
SHOW STATUS LIKE 'Qcache%';
-- 關鍵指標解讀
Qcache_hits / (Qcache_hits + Qcache_inserts) -- 命中率
Qcache_lowmem_prunes -- 因內存不足剔除次數,持續增長需擴容
Qcache_free_blocks -- 碎片指標,過大執行 FLUSH QUERY CACHE
維護操作
FLUSH QUERY CACHE; -- 整理碎片,不清內容
RESET QUERY CACHE; -- 清空所有緩存
FLUSH TABLES; -- 同側效清空緩存
MySQL 8.0 遷移替代方案
- 應用層緩存:Redis/Memcached,Key 可控、支援集群、TTL 靈活。
- 資料庫層優化:覆蓋索引、MRR、Hash Join、並行查詢提升原始性能。
- 中間件:ProxySQL、MyCat 內建查詢緩存模組。
- 上一篇文章: MySQL 四捨五入函數家族實戰:ROUND、FLOOR、CEILING、TRUNCATE 精度控制全解析
- 下一篇文章: MySQL 用戶創建、授權、刪除與權限審計完整操作指南
Copyright ©
程式碼之家 All Rights Reserved