首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 查詢快取深度解析:Qcache 核心指標、碎片率、命中率與配置優化

     編輯:MySQL 綜合教學

前言

MySQL Query Cache(5.7.20 棄用、8.0 移除)在舊版本仍廣泛使用。本文完整解析 Qcache_* 狀態變數、碎片率/利用率/命中率三大核心比率計算與優化策略。

核心狀態變數

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        |  -- 快取模式
| query_cache_wlock_invalidate | OFF       |  -- 寫鎖時是否失效快取
+------------------------------+-----------+

三大核心比率計算與判讀

1. 碎片率

碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

案例:22,756 / 111,212 ≈ 20.46% → 超過 20% 需整理。

  • 執行 FLUSH QUERY CACHE 整理碎片。
  • 若查詢多為小結果集,嘗試降低 query_cache_min_res_unit(如 2048)。

2. 利用率

利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%

案例:(203,423,744 - 76,764,704) / 203,423,744 ≈ 62.26% → 健康區間。

利用率判讀
< 25%過大,建議縮小
25% - 80%正常
> 80% 且 Qcache_lowmem_prunes > 50過小或碎片嚴重

3. 命中率

命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%

案例:(213,028,692 - 208,894,227) / 213,028,692 ≈ 1.94% → 極低。

  • 可能原因:寫操作頻繁導致快取頻繁失效、碎片嚴重、查詢模式不適合快取。
  • 建議:啟用 query_cache_type = DEMAND,配合 SQL_CACHE 明確指定快取查詢。

遷移建議(MySQL 5.7+/8.0)

  • Query Cache 已移除,改用應用層快取或 ProxySQL。
  • 若維持舊版,定期 FLUSH QUERY CACHE 並監控三大比率。

相關延伸閱讀

  • MySQL 慢查詢啟用方法
  • MySQL 多表查詢實現
  • MySQL CONVERT 函數簡介
  • Linux 下修改 MySQL 字符集的方法
  • 帶您了解 MySQL 變數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved