查詢快取 將「SQL 文本 + 查詢結果」以 Hash 表形式存放於記憶體。相同 SQL 再次執行時,直接回傳快取結果,跳過解析、優化、執行全流程。但表結構或資料變更(INSERT/UPDATE/DELETE/TRUNCATE/ALTER/DROP)會導致相關快取失效。對於「讀多寫少、重複查詢高」的場景(如報表、配置表),開啟快取可顯著提升吞吐;反之「寫入頻繁」的表則不適合。
NOW()、RAND()、CURRENT_DATE()、UUID()、USER() 等DETERMINISTIC)mysql 資料庫表、INFORMATION_SCHEMA、performance_schemaSQL_NO_CACHE 提示FLUSH TABLES、RESET QUERY CACHE 手動清空快取記憶體由 query_cache_size 分配,約 40KB 用於元資料。最小儲存單元 query_cache_min_res_unit(預設 4KB)。
Qcache_free_blocks 增加、Qcache_lowmem_prunes 上升(被動淘汰)| 指標 | 含義 | 健康閾值 |
|---|---|---|
| 命中率 | Qcache_hits / (Qcache_hits + Com_select) | > 30% 視業務而定 |
| 寫入率 | Qcache_inserts / (Qcache_hits + Com_select) | 越低越好 |
| 命中/寫入比 | Qcache_hits / Qcache_inserts | > 3:1 有效,> 10:1 優秀 |
| 碎片率 | Qcache_free_blocks / Qcache_total_blocks | < 20% |
| 記憶體利用率 | (query_cache_size - Qcache_free_memory) / query_cache_size | 80%~95% |
[mysqld]
query_cache_type = DEMAND # OFF/ON/DEMAND,建議 DEMAND 由應用控制
query_cache_size = 256M # 總快取記憶體,必須 1024 倍數
query_cache_min_res_unit = 2K # 小結果集調小減少碎片,大結果集調大減少分配次數
query_cache_limit = 2M # 單查詢最大快取結果,超過不快取
query_cache_wlock_invalidate = OFF # 表鎖定時是否仍回傳快取
FLUSH QUERY CACHE:整理碎片(執行期間鎖定快取,短暫阻塞)RESET QUERY CACHE:完全清空快取Qcache_lowmem_prunes,若持續增長需擴容或調整 min_res_unitSELECT ... LOCK IN SHARE MODE、FOR UPDATE)完全繞過快取SET GLOBAL query_cache_size = 600000;
SET SESSION query_cache_type = ON;
USE test;
SELECT COUNT(*) FROM animals; -- 第一次執行
SHOW STATUS LIKE 'Qcache_hits'; -- 0
SELECT COUNT(*) FROM animals; -- 第二次執行
SHOW STATUS LIKE 'Qcache_hits'; -- 1
INSERT INTO animals VALUES (9,'test'); -- 寫入導致快取失效
SELECT COUNT(*) FROM animals; -- 再次執行,未命中
SHOW STATUS LIKE 'Qcache_hits'; -- 仍為 1
SELECT COUNT(*) FROM animals; -- 重新快取
SHOW STATUS LIKE 'Qcache_hits'; -- 2
query_cache_type=OFF),僅對經證實「高重複、低變更」的查詢使用 SQL_CACHE 提示開啟Qcache_hits / Qcache_inserts 比值,長期 < 3:1 應考慮關閉