Query Cache (QC) 基本機制
- 依 SQL 文本字面內容 作為 Key 快取 SELECT 結果。
- 大小寫、空格、註解差異會導致不同快取條目(客戶端可能預處理,如命令列移除註解與首尾空白)。
- 僅
SELECT 指令被快取;SHOW、USE 等不快取。
失效機制
任何相關表被修改(INSERT/UPDATE/DELETE/TRUNCATE/ALTER)即刻失效所有關聯查詢快取。 聯合查詢涉及多表,任一表更新即全失效。頻繁寫入的表不宜開啟 QC,否則快取失效開銷大於收益。
對策:預設開啟 QC,對頻繁更新表的查詢加 SQL_NO_CACHE 禁用快取。
不適合快取的查詢模式
- 高度分散、低重複率查詢(如
SELECT pass FROM user WHERE name='xxx'),每次登入 SQL 文本不同,快取命中率近零,僅佔用記憶體。
記憶體管理:儲存塊
- 結果集分塊儲存,塊大小由
query_cache_min_res_unit 控制(預設 4KB)。
- 最後一塊未滿釋放剩餘空間;塊太小產生碎片,太大導致頻繁分配。
- 每個快取條目佔用:SQL 文本塊 + 表資訊塊(共享)+ 結果塊數 × 2。
- 觀察指標:
Qcache_queries_in_cache / Qcache_total_blocks 比值接近 1:2 表示塊大小適中;偏大需增 query_cache_min_res_unit,偏小需減。
關鍵配置參數
| 參數 | 說明 |
query_cache_limit | 單一查詢結果超過此值不快取(預設 1MB)。 |
query_cache_size | 分配給 QC 總記憶體,設 0 即禁用。需約 40KB 管理結構,設值勿低於此。 |
query_cache_min_res_unit | 單一儲存塊大小,預設 4KB,依碎片情況調整。 |
query_cache_type | 0=關閉,1=開啟(預設),2=DEMAND 模式(需 SQL_CACHE 才快取)。 |
監控與調校策略
Qcache_lowmem_prunes 快速增長 → 記憶體不足淘汰快取 → 增加 query_cache_size,目標使其零增長。
Qcache_hits / (Qcache_hits + Qcache_inserts) = 命中率,低於 20% 考慮關閉或縮小 QC。
- 頻繁寫入系統建議設
query_cache_type=2(DEMAND),明確標註可快取查詢。
查看當前狀態
mysql> SHOW VARIABLES LIKE 'query_cache%';
mysql> SHOW STATUS LIKE 'Qcache%';
- 上一篇文章: MySQL 儲存引擎深度對比:MyISAM vs InnoDB 在插入、查詢、事務、鎖粒度、崩潰恢復五大維度實測分析
- 下一篇文章: MySQL 字元集編碼轉換陷阱:latin1、gbk、utf8 三碼合一錯誤與正確修正實戰
Copyright ©
程式碼之家 All Rights Reserved