查詢緩存儲存 SELECT 語句文本與對應結果集映射。相同查詢(區分大小寫、空白)再次到達時,直接返回緩存結果,跳過解析、優化、執行階段,大幅提升讀密集型負載效能。
適用:數據變更頻率低、重複查詢多的場景(如配置表、字典表、報表查詢)。
不適用:高寫入頻率表、包含非確定性函數(NOW(), RAND())的查詢、大結果集。
編輯 my.cnf [mysqld] 區段:
query_cache_size=10M # 緩存總大小,0 為關閉 query_cache_type=1 # 1=開啟(預設), 2=DEMAND(按需), 0=關閉 query_cache_limit=1M # 單條查詢結果最大緩存 query_cache_min_res_unit=4K # 最小分配塊,大查詢可調大減少碎片
重啟 MySQL 生效。驗證:
SHOW VARIABLES LIKE '%query_cache%';
SHOW STATUS LIKE 'Qcache%';
| 變數 | 含義 | 健康判讀 |
|---|---|---|
| Qcache_free_blocks | 空閒記憶體塊數 | 過大說明碎片嚴重,需 FLUSH QUERY CACHE |
| Qcache_free_memory | 空閒記憶體位元組 | 持續下降需擴容或清理 |
| Qcache_hits | 命中次數 | 命中率 = Hits / (Hits + Inserts) |
| Qcache_inserts | 插入次數 | 同上 |
| Qcache_lowmem_prunes | 因記憶體不足清理次數 | 持續增長 = 記憶體不足或碎片嚴重 |
| Qcache_not_cached | 未緩存查詢數 | 非 SELECT 或含不確定函數 |
| Qcache_queries_in_cache | 當前緩存查詢數 | 監控緩存利用率 |
| Qcache_total_blocks | 總塊數 | 配合 free_blocks 看碎片率 |
命令 作用 影響範圍 FLUSH QUERY CACHE整理碎片,合併空閒塊,不刪除現有緩存 緩存結構優化 RESET QUERY CACHE完全清空查詢緩存所有內容 所有緩存失效 FLUSH TABLES關閉所有打開表,**順帶清空查詢緩存** 表鎖 + 緩存清空 SET GLOBAL query_cache_size=0動態禁用查詢緩存(需重啟才能重新啟用) 全域關閉 七、FLUSH 系列命令速查表
FLUSH HOSTS -- 清空主機緩存表(解決 Host blocked) FLUSH LOGS -- 切換二進制日誌文件 FLUSH PRIVILEGES -- 重載授權表(權限修改後必執行) FLUSH TABLES -- 關閉所有表 + 清空查詢緩存 FLUSH TABLES WITH READ LOCK -- 全域讀鎖(備份前常用) FLUSH STATUS -- 重置狀態變數 FLUSH QUERY CACHE -- 整理查詢緩存碎片 -- 以下已棄用,改用 RESET MASTER/SLAVE FLUSH MASTER / FLUSH SLAVE八、重要參數
sync_binlog補充
sync_binlog=0:不強制 fsync,性能最好,崩潰丟數據風險最大(預設)sync_binlog=1:每次提交 fsync,最安全,性能損耗約 10-20%sync_binlog=N:每 N 次提交 fsync,折中方案生產環境建議 sync_binlog=1 配合電池備援 RAID 卡(BBWC/FBWC)平衡性能與安全。
Qcache_lowmem_prunes 與 Qcache_free_blocks 及時發現碎片與容量問題。FLUSH QUERY CACHE(整理)與 RESET QUERY CACHE(清空),避免誤操作導致緩存雪崩。FLUSH PRIVILEGES,主從切換涉及 RESET MASTER/SLAVE。