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

啟用 MySQL 查詢緩存:CPU 使用率從 120% 降至 10% 實戰

     編輯:MySQL 綜合教學

MySQL Query Cache 實戰效果與配置指南

查詢緩存將 SELECT 結果集完整緩存,相同查詢直接返回結果,繞過解析、優化、執行全流程。實測:開啟前 CPU 120% → 開啟後 10%,效果顯著。

檢查當前狀態


mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| have_query_cache             | YES      |
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 20971520 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

query_cache_type = ON 表示已啟用。若為 OFF 需配置開啟。

開啟配置


# /etc/my.cnf
[mysqld]
query_cache_size = 20M
query_cache_type = ON

重啟生效:service mysql restart

監控緩存效果


mysql> SHOW STATUS LIKE 'qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 83       |
| Qcache_free_memory      | 19811040 |
| Qcache_hits             | 3108196  |
| Qcache_inserts          | 757254   |
| Qcache_lowmem_prunes    | 20720    |
| Qcache_not_cached       | 47219    |
| Qcache_queries_in_cache | 47       |
| Qcache_total_blocks     | 276      |
+-------------------------+----------+

關鍵指標解讀

指標含義健康判斷
Qcache_hits命中次數越高越好
Qcache_inserts插入次數(未命中)對比 Hits 計算命中率
Qcache_hits / (Qcache_hits + Qcache_inserts)命中率> 80% 為優秀
Qcache_lowmem_prunes因內存不足清理次數持續增長 = 緩存太小或碎片嚴重
Qcache_free_blocks空閒塊數(碎片指標)過大執行 FLUSH QUERY CACHE 整理
Qcache_not_cached不緩存查詢數含非 SELECT、不確定函數(NOW())、大結果集

命中率計算範例


命中率 = 3108196 / (3108196 + 757254) = 80.4%  -- 良好

參數調優建議

參數建議值說明
query_cache_size50M-200M視機器內存與查詢結果集大小,避免過大鎖競爭
query_cache_limit1M-4M單個結果集超過此值不緩存,防大查詢佔滿緩存
query_cache_min_res_unit4K-8K分配最小單元,過小碎片多,過大浪費內存
query_cache_wlock_invalidateON寫鎖時使相關緩存失效,保證數據一致性

強制繞過緩存


SELECT SQL_NO_CACHE COUNT(*) FROM users WHERE email = 'hello';

適用於:實時性要求高、頻繁更新的表、大結果集查詢。

重要遺棄提醒

MySQL 5.7.20 起標記棄用,8.0 完全移除 Query Cache。

  • 原因:全局鎖競爭嚴重,多核擴展性差,高併發寫入場景性能倒退
  • 替代方案:應用層緩存、ProxySQL、Redis、Prepared Statement + 客戶端緩存
  • 僅建議在唯讀/極少寫入、單核/雙核、MySQL 5.6/5.7 老版本場景使用

遷移建議

  1. 評估業務讀寫比:讀多寫極少(如配置表、字典表)可考慮保留
  2. 引入 Redis 做查詢結果緩存,應用層控制失效策略
  3. 升級 MySQL 8.0 時必須移除 query_cache_* 配置,否則啟動報錯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved