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

MySQL Query Cache 啟用與參數詳解:query_cache_size、query_cache_type 實戰配置

     編輯:MySQL 綜合教學

核心認知

  • Query Cache **緩存 SELECT 結果集**,相同 SQL (大小寫、空格、註釋完全一致) 直接返回,繞過解析/優化/執行。
  • MySQL 5.7.20 棄用,8.0 移除 (因鎖競爭、失效率高、不支援分區表/事務隔離),**生產環境建議關閉**,改用 Redis/應用層緩存。
  • 僅適用於 **「讀多寫少、表極少變更、重複查詢極高」** 的舊版本 (5.6/5.7 早期) 場景。

關鍵參數

參數默認值說明
query_cache_size0 (禁用)緩存總內存,0=關閉。建議 32M~128M,1024 倍數。
query_cache_type0 (OFF)0=關閉;1=ON (默認緩存所有 SELECT,除非 SQL_NO_CACHE);2=DEMAND (僅緩存 SQL_CACHE 指定)。
query_cache_limit1M單個結果集最大緩存大小,超過不緩存。
query_cache_min_res_unit4K緩存分配最小塊,過小碎片多,過大浪費。典型 4K~32K。
query_cache_wlock_invalidateOFF寫鎖時是否使緩存失效,ON 可減少髒讀但增鎖開銷。

啟用配置示例 (my.cnf)

[mysqld]
query_cache_size = 128M
query_cache_type = 1
query_cache_limit = 2M
query_cache_min_res_unit = 8K

重啟驗證:

SHOW VARIABLES LIKE 'query_cache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| query_cache_size        | 134217728  -- 128M
| query_cache_type        | ON
| query_cache_limit       | 2097152
| query_cache_min_res_unit| 8192
+-------------------------+-----------+

運行時狀態監控

SHOW STATUS LIKE 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         -- 空閒塊數,大說明碎片多
| Qcache_free_memory      | 134207264 -- 剩餘內存
| Qcache_hits             | 1500      -- 命中次數 (核心指標)
| Qcache_inserts          | 200       -- 未命中插入次數
| Qcache_lowmem_prunes    | 0         -- 內存不足淘汰次數,>0 需擴容
| Qcache_not_cached       | 50        -- 因 type/limit 不緩存數
| Qcache_queries_in_cache | 180       -- 當前緩存查詢數
| Qcache_total_blocks     | 361       -- 總塊數
+-------------------------+-----------+

效果驗證實戰

-- 首次查詢
SELECT * FROM user WHERE id = 2;  -- Qcache_inserts +1

-- 相同查詢
SELECT * FROM user WHERE id = 2;  -- Qcache_hits +1, Qcache_inserts 不變

失效場景 (緩存不生效/被清空)

  • 表有任何 INSERT/UPDATE/DELETE/TRUNCATE/ALTER → 相關表所有緩存**全量失效** (極大開銷)。
  • 查詢包含不確定函數:NOW(), RAND(), UUID(), USER() 等。
  • 查詢使用 SQL_NO_CACHE 或 query_cache_type=2 未加 SQL_CACHE。
  • 結果集 > query_cache_limit。
  • 不同客戶端字符集/排序規則導致 SQL 文本不完全一致。

最佳實踐建議

  1. MySQL 5.7+ / 8.0: 確保 query_cache_size=0, query_cache_type=0,專注 innodb_buffer_pool 與外部緩存 (Redis)。
  2. 舊版本必須開啟: 僅針對「配置表、字典表、靜態報表」等極少變更的表,設置 query_cache_type=2 + SQL_CACHE 精準控制。
  3. 監控 Qcache_lowmem_prunes 與 Qcache_hits / Qcache_inserts 比值,命中率 < 80% 考慮關閉。
  4. 定期 FLUSH QUERY CACHE 整理碎片 (鎖表,慎用)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved