MySQL 8.0 已移除 Query Cache。 本文適用於 MySQL 5.7 及之前版本。新版本請使用 準備語句緩存、Redis/ProxySQL 等外部緩存 方案。
query_cache_size 內存區按哈希表組織query_cache_limit 限制)| 參數 | 默認值 | 建議值 | 說明 |
|---|---|---|---|
| query_cache_type | ON (1) | DEMAND (2) | 0=關閉, 1=全開, 2=按需(SQL_CACHE) |
| query_cache_size | 0 (關閉) | 64M-256M | 總內存,< 40KB 實際關閉,1024 字節對齊 |
| query_cache_limit | 1M | 1M-4M | 單個結果集上限,超過不緩存 |
| query_cache_min_res_unit | 4KB | 1KB-8KB | 結果集分配塊大小,影響碎片 |
| query_cache_wlock_invalidate | OFF | ON | 寫鎖時是否失效緩存 |
| 指標 | 含義 | 健康判斷 |
|---|---|---|
| Qcache_hits | 命中次數 | 持續增長為好 |
| Qcache_inserts | 新增緩存數 | 與 hits 比值反映命中率 |
| Qcache_lowmem_prunes | 因內存不足清理數 | 快速增長 → 擴大 size 或縮小 min_res_unit |
| Qcache_free_memory | 剩餘內存 | 長期 < 10% → 擴容 |
| Qcache_queries_in_cache | 當前緩存查詢數 | 配合 total_blocks 計算平均塊數 |
| Qcache_total_blocks | 總塊數 | blocks/queries ≈ 2 為佳;>>2 説明碎片嚴重 |
| Qcache_free_blocks | 空閒塊數 | 過多說明碎片,執行 FLUSH QUERY CACHE 整理 |
Hit Ratio = Qcache_hits / (Qcache_hits + Qcache_inserts + Qcache_not_cached)
-- 目標 > 80% 為優秀
-- 現象:Qcache_total_blocks / Qcache_queries_in_cache > 5
-- 對策:增大 min_res_unit
SET GLOBAL query_cache_min_res_unit = 8192; -- 8KB
FLUSH QUERY CACHE;
-- 現象:Qcache_lowmem_prunes 快速增長
-- 對策:增大 size 或啟用按需模式
SET GLOBAL query_cache_size = 256M;
-- 或
SET GLOBAL query_cache_type = 2; -- 需 SQL_CACHE 顯式啟用
-- 對高頻更新表的查詢禁用緩存
SELECT SQL_NO_CACHE * FROM high_freq_table WHERE ...;
-- 或表級禁用(MySQL 5.7+)
ALTER TABLE high_freq_table QUERY_CACHE = 0; -- 需 enterprise 版
query_cache_limit)NOW(), RAND(), UUID())SQL_CALC_FOUND_ROWS、FOUND_ROWS() 的查詢Query Cache 在「讀多寫少、查詢重複度高、結果集小」場景下極其有效,但隨著寫入比例上升,維護成本指數級增長。MySQL 8.0 移除它是順應架構演進的必然。現代架構應將緩存下沉到應用層或專用中間件,實現更精細的控制與水平擴展。