MySQL 5.7 前的 Query Cache(QC)曾是「開啟即加速」的銀彈,但因嚴重鎖爭用、失效率高、無法擴展,已在 8.0 徹底移除。本文解析 QC 原理、關鍵指標判讀,並給出生產級替代架構。
SQL_CACHE 標誌。| 變量 | 含義 | 異常判讀 |
|---|---|---|
Qcache_hits | 命中次數 | 持續增長說明有重複查詢受益 |
Qcache_inserts | 新增緩存條目 | 遠大於 Hits → 重複率低、緩存污染 |
Qcache_lowmem_prunes | 因內存不足被剔除次數 | 持續增長 → query_cache_size 過小或碎片嚴重 |
Qcache_free_blocks | 空閒塊數 | 值大 → 碎片多,FLUSH QUERY CACHE 可整理(但會阻塞) |
Qcache_not_cached | 未緩存查詢數 | 含非確定函數、大結果集、SQL_NO_CACHE |
query_cache_type = DEMAND -- 顯式 SQL_CACHE 才緩存
query_cache_size = 64M -- 別超 128M,越大鎖爭用越烈
query_cache_limit = 1M -- 單查詢結果超 1M 不緩存
query_cache_min_res_unit = 4K -- 減少碎片,但會增大內存佔用
判斷是否關閉:Qcache_hits / (Qcache_hits + Com_select) < 20% 且 Qcache_lowmem_prunes 高 → 關閉獲益更大。
| 層級 | 場景 | 技術棧 | 關鍵設計 |
|---|---|---|---|
| L1:進程內 | 熱點配置、字典、權限 | Caffeine / Guava Cache | 本地緩存 + 變更廣播(Redis PubSub / Canal)失效 |
| L2:分布式 | 會話、購物車、熱點商品詳情 | Redis Cluster / KeyDB | TTL + 主動刷新 / 旁路緩存模式 |
| L3:計算層 | 複雜報表、OLAP 聚合 | ClickHouse / Apache Doris / StarRocks | 物化視圖 / 預計算寬表 / 實時 Flink 寫入 |
| L4:存儲引擎 | 索引下推、自適應哈希索引、Buffer Pool | InnoDB 內建 | innodb_buffer_pool_size 佔物理內存 70% |
query_cache_type=OFF、query_cache_size=0 徹底關閉,騰出內存給 Buffer Pool。Query Cache 退出歷史舞台,是因為「單機全局鎖」無法適應多核高併發時代。分層、分佈、異步,才是現代緩存架構的正解。