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 |
-- 明確不快取
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、REPLACETRUNCATE TABLEALTER TABLE、DROP TABLE、DROP DATABASEGRANT、REVOKE(權限變更)FLUSH TABLES寫入頻繁的表不適合開啟 Query Cache,每次寫入都要獲取全域鎖遍歷失效相關快取,嚴重阻塞並發。
query_cache_min_res_unit,最後一塊釋放餘量)FLUSH QUERY CACHE 整理空閒塊,不清除有效快取;RESET 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 / 應用層快取 |
query_cache_type = 1、query_cache_size = 64M-256MQcache_lowmem_prunes = 0,Qcache_free_blocks / Qcache_total_blocks < 0.2SQL_NO_CACHE 或 query_cache_type = 2 按需快取FLUSH QUERY CACHE 整理碎片(低峰期)query_cache_limitQuery Cache 是單機時代的產物,分布式、高併發、多核時代已不適用。維護 5.6/5.7 老系統時做好監控與調優;新架構直接選 Redis/應用層快取/OLAP 引擎,別再糾結 Query Cache 參數調優。