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

MySQL 查詢緩存完整指南:配置、監控、失效機制與 FLUSH 命令詳解

     編輯:MySQL 資料庫相關知識

MySQL 查詢緩存曾是提升讀密集型應用效能的利器(MySQL 5.7 仍支援,8.0 已移除)。本文詳細記錄查詢緩存的配置參數、啟用驗證、命中率監控、失效條件、記憶體管理與碎片整理,以及 FLUSH 系列命令的完整用法與應用場景。

一、查詢緩存工作原理

  • 緩存 SQL 文本(區分大小寫、空格、註釋) 與 查詢結果集 的映射。
  • 收到相同 SQL 時,直接返回緩存結果,跳過解析、優化、執行。
  • 表結構或資料變更(INSERT/UPDATE/DELETE/TRUNCATE/ALTER/DROP)導致該表相關緩存失效。

二、配置參數詳解

修改 my.cnf [mysqld] 區段:

[mysqld]
query_cache_type = 1        # 0=OFF, 1=ON, 2=DEMAND
query_cache_size = 64M      # 總記憶體大小,必須 1024 倍數
query_cache_limit = 2M      # 單次查詢結果最大緩存大小
query_cache_min_res_unit = 4K  # 最小記憶體塊大小

query_cache_type 三種模式

值行為
0 / OFF關閉查詢緩存
1 / ON緩存所有 SELECT,除非用 SQL_NO_CACHE 提示
2 / DEMAND僅緩存帶 SQL_CACHE 提示的 SELECT

三、驗證與監控指標

SHOW VARIABLES LIKE '%query_cache%';
SHOW STATUS LIKE 'Qcache%';

關鍵狀態變數解讀

變數含義健康判斷
Qcache_hits緩存命中次數持續增長為佳
Qcache_inserts緩存寫入次數—
Qcache_hits / Qcache_inserts命中/寫入比> 3:1 視為有效,> 10:1 為優秀
Qcache_lowmem_prunes記憶體不足被淘汰次數持續增長 = 記憶體不足或碎片嚴重
Qcache_free_blocks空閒記憶體塊數過大 = 碎片多
Qcache_free_memory剩餘記憶體—
Qcache_not_cached未緩存查詢數(非 SELECT、含不確定函數等)—
Qcache_queries_in_cache當前緩存查詢數—
Qcache_total_blocks總記憶體塊數—

四、緩存失效條件(重要)

  • 表結構/資料異動:INSERT/UPDATE/DELETE/TRUNCATE/ALTER TABLE/DROP TABLE/DROP DATABASE
  • 查詢含不確定函數:NOW()、RAND()、UUID()、CURRENT_DATE() 等
  • 查詢使用 SQL_NO_CACHE 提示
  • query_cache_type = 0 或 DEMAND 模式下無 SQL_CACHE
  • 結果集大小超過 query_cache_limit
  • 事務期間(InnoDB):修改表的事務提交前,該表緩存不可用
  • 表被鎖定(LOCK TABLES)時,視 query_cache_wlock_invalidate 設定

五、記憶體管理與碎片整理

  • 緩存區劃分為固定大小塊(query_cache_min_res_unit,預設 4KB)。
  • 查詢開始前預分配塊,結果寫入;結束時釋放多餘空間 → 產生碎片。
  • 整理碎片: FLUSH QUERY CACHE(不清除現有緩存,僅整理碎片,期間阻塞其他連接使用緩存)。
  • 清空緩存: RESET QUERY CACHE。

六、FLUSH 命令完整速查表

命令作用常用場景是否寫入 Binlog
FLUSH HOSTS清空主機緩存表主機 IP 變更、Host ... is blocked 錯誤是
FLUSH LOGS關閉當前 binlog,啟動新檔案備份前切割日志否
FLUSH PRIVILEGES重新載入授權表到緩存手動修改 mysql.user 後生效是
FLUSH TABLES關閉所有打開表,清空查詢緩存DDL 操作前、備份鎖表前是
FLUSH TABLES WITH READ LOCK關閉表 + 全庫讀鎖邏輯備份(mysqldump --single-transaction 除外)否
FLUSH STATUS重置大多數狀態變數基準測試前重置計數器是
FLUSH QUERY CACHE整理查詢緩存碎片碎片率高時定期執行是
RESET MASTER刪除所有 binlog,重置索引重新搭建主從、清理測試環境否
RESET SLAVE從庫忘記主庫位置,刪除 relay log重新配置主從複制否

七、效能調優建議

  1. 讀多寫少場景(配置表、字典表、靜態報表)開啟 query_cache_type=1,設 query_cache_size=64M~256M。
  2. 寫入頻繁表 禁用緩存(SQL_NO_CACHE 或表級禁用),避免頻繁失效帶來的鎖競爭與 CPU 開銷。
  3. 監控 Qcache_lowmem_prunes:持續增長 → 擴大 query_cache_size 或調大 query_cache_min_res_unit(大結果集場景)。
  4. MySQL 8.0+ 已移除查詢緩存:建議改用 Redis、應用層緩存、或 PreparedStatement 復用執行計畫。

八、總結

查詢緩存透過「以空間換時間」提升重複查詢效能,但伴隨鎖競爭、碎片、失效維護等開銷。MySQL 5.7 仍可用,8.0 已移除。生產環境請依據讀寫比、資料變更頻率、結果集大小綜合評估,配合監控指標動態調整,或遷移至外部緩存架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved