查詢緩存將 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_limitSQL_NO_CACHE 提示:SELECT SQL_NO_CACHE * FROM t| 場景 | 建議 | 理由 |
|---|---|---|
| 讀多寫少、重複查詢高(配置表、字典表、報表) | ✅ 開啟 | 命中率高,收益大於失效開銷 |
| 寫入頻繁(訂單、日誌、計數器) | ❌ 關閉 | 頻繁失效導致鎖競爭、CPU 浪費 |
| 大結果集、非重複查詢 | ❌ 關閉 | 佔用內存、無命中 |
| 高併發寫入表 | ❌ 關閉 | 全局鎖成為瓶頸 |
SELECT SQL_CACHE * FROM t; -- 明確緩存 (type=2 時生效)
SELECT SQL_NO_CACHE * FROM t; -- 明確不緩存
query_cache_type=0 並設置 query_cache_size=0 徹底關閉。