首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 查詢快取(Query Cache)變數深度解析與調優實戰

     編輯:MySQL 資料庫相關知識

核心狀態變數

mysql> SHOW GLOBAL STATUS LIKE 'qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 22756     |
| Qcache_free_memory      | 76764704  |
| Qcache_hits             | 213028692 |
| Qcache_inserts          | 208894227 |
| Qcache_lowmem_prunes    | 4010916   |
| Qcache_not_cached       | 13385031  |
| Qcache_queries_in_cache | 43560     |
| Qcache_total_blocks     | 111212    |
+-------------------------+-----------+

變數含義與健康度指標

變數含義異常徵兆
Qcache_free_blocks閒置記憶體區塊數過大 → 碎片嚴重
Qcache_free_memory閒置記憶體位元組過小 → 記憶體不足
Qcache_hits快取命中次數持續增長為正常
Qcache_inserts快取插入次數-
Qcache_lowmem_prunes因記憶體不足淘汰查詢次數持續增長 → 需加大快取或整理碎片
Qcache_not_cached不適合快取的查詢數(非 SELECT、含 NOW() 等)-
Qcache_queries_in_cache當前快取查詢數-
Qcache_total_blocks總區塊數-

關鍵配置參數

mysql> SHOW VARIABLES LIKE 'query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| query_cache_limit            | 2097152   |  -- 單查詢結果超過此大小不快取 (2MB)
| query_cache_min_res_unit     | 4096      |  -- 快取區塊最小單位 (4KB)
| query_cache_size             | 203423744 |  -- 快取總大小 (194MB)
| query_cache_type             | ON        |  -- ON/DEMAND/OFF
| query_cache_wlock_invalidate | OFF       |  -- 寫鎖時是否失效快取
+------------------------------+-----------+

三大核心效率指標計算

-- 碎片率
Qcache_free_blocks / Qcache_total_blocks * 100%  -- >20% 需 FLUSH QUERY CACHE 或調小 min_res_unit

-- 利用率
(query_cache_size - Qcache_free_memory) / query_cache_size * 100%  -- <25% 過大;>80% 且 lowmem_prunes>50 過小

-- 命中率
(Qcache_hits - Qcache_inserts) / Qcache_hits * 100%  -- 範例僅 1.94%,極低,可能寫入頻繁導致快取頻繁失效

調優建議

  1. 寫入頻繁的表:查詢快取失效極快,建議關閉 (`query_cache_type=OFF`) 或僅對唯讀表啟用 (`DEMAND` + `SQL_CACHE`)。
  2. 碎片整理:定期 `FLUSH QUERY CACHE` 或重啟服務。
  3. 區塊大小:小結果集多 → 調小 `query_cache_min_res_unit` (如 1KB);大結果集多 → 調大。
  4. MySQL 5.7.20+ 已棄用,8.0 移除:新版請改用 Redis/Memcached 等外部快取層。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved