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

MySQL Query Cache 深度解析:原理、配置、監控與最佳實務

     編輯:MySQL 資料庫相關知識

運作原理

  • 針對 SELECT 語句,以 **SQL 文本為 Key** 經 Hash 運算存入 Hash Bucket
  • Value 為 **Result Set (結果集)** 存放於記憶體快取區
  • 節點同時記錄:涉及的表標識、結果集記憶體位址
  • 任何表資料異動 (INSERT/UPDATE/DELETE/TRUNCATE/ALTER) 觸發相關快取**全量失效**

關鍵特性與限制

  1. 精確匹配:大小寫、空格、註解差異視為不同 Key (建議統一 SQL 格式規範)
  2. 不支援:SHOW、USE、PREPARE、存儲函數、用戶變量、臨時表、系統表查詢
  3. 頻繁更新表慎用:快取失效頻率高會增加管理開銷,反而拖慢效能
  4. 大結果集風險:單查詢結果超過 query_cache_limit (預設 1MB) 不快取

SQL Hint 控制

  • SELECT SQL_CACHE ...:強制快取 (需 query_cache_type=2)
  • SELECT SQL_NO_CACHE ...:強制不快取 (適用頻繁更新表、大結果集、一次性查詢)

記憶體管理:存儲塊

  • 結果集分塊存儲,塊大小由 query_cache_min_res_unit 控制 (預設 4KB)
  • 最後一塊未滿釋放剩餘空間
  • 塊過小 → 分配頻繁、碎片多;塊過大 → 內部碎片浪費

核心配置參數

參數說明建議
query_cache_type0=關閉, 1=開啟(預設), 2=按需生產環境建議 2 (按需),配合 SQL Hint
query_cache_size總記憶體配額 (0=關閉)視重複查詢比例調整,典型 64MB-512MB
query_cache_limit單查詢最大快取大小預設 1MB,大報表查詢可調大
query_cache_min_res_unit分配塊最小單位小結果集多調小 (1KB),大結果集調大 (16-32KB)
query_cache_wlock_invalidate寫鎖時是否返回快取通常 OFF,避免髒讀

狀態監控指標

SHOW STATUS LIKE 'Qcache%';
指標含義健康判讀
Qcache_hits命中次數越高越好
Qcache_inserts插入次數 (未命中)--
Qcache_hits / (Qcache_hits + Qcache_inserts)**命中率**> 80% 為佳,< 20% 考慮關閉
Qcache_lowmem_prunes因記憶體不足被淘汰次數持續增長 → 調大 size 或調小 min_res_unit
Qcache_free_blocks / Qcache_total_blocks**碎片率**> 20% 執行 FLUSH QUERY CACHE
(query_cache_size - Qcache_free_memory) / query_cache_size**記憶體利用率**25%-80% 區間為健康

最佳實務總結

  1. **按需啟用** (query_cache_type=2) + SQL_CACHE 針對靜態/半靜態查詢
  2. 頻繁更新表、大結果集、一次性查詢 → SQL_NO_CACHE
  3. 監控命中率與碎片率,定期 FLUSH QUERY CACHE 整理
  4. MySQL 5.7+ 官方已棄用,8.0 移除,**新專案建議改用 Redis/Memcached 應用層快取**
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved