| 參數 | 默認值 | 說明 |
|---|---|---|
query_cache_size | 0 (禁用) | 緩存總內存,0=關閉。建議 32M~128M,1024 倍數。 |
query_cache_type | 0 (OFF) | 0=關閉;1=ON (默認緩存所有 SELECT,除非 SQL_NO_CACHE);2=DEMAND (僅緩存 SQL_CACHE 指定)。 |
query_cache_limit | 1M | 單個結果集最大緩存大小,超過不緩存。 |
query_cache_min_res_unit | 4K | 緩存分配最小塊,過小碎片多,過大浪費。典型 4K~32K。 |
query_cache_wlock_invalidate | OFF | 寫鎖時是否使緩存失效,ON 可減少髒讀但增鎖開銷。 |
[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。query_cache_size=0, query_cache_type=0,專注 innodb_buffer_pool 與外部緩存 (Redis)。query_cache_type=2 + SQL_CACHE 精準控制。Qcache_lowmem_prunes 與 Qcache_hits / Qcache_inserts 比值,命中率 < 80% 考慮關閉。FLUSH QUERY CACHE 整理碎片 (鎖表,慎用)。