基於 Percona 官方測試與社區實戰經驗,本文剖析 Query Cache 的全局鎖爭用機制、命中收益與併發代價的權衡,給出生產環境配置建議。
Query Cache 的讀寫操作均需獲取全局 mutex,導致所有訪問串行化。這在 15 年前單核時代可接受,但在現代多核服務器上成為性能殺手:
「任何讀寫操作都必須獲得全局鎖,意味著所有訪問都被串行化。這在當今多核服務器上是扼殺性能的最佳方式。」 —— Percona
Percona 測試與社區驗證一致表明:
query_cache_size 無改善,甚至惡化(鎖競爭更激烈)query_cache_type = OFF、query_cache_size = 0query_cache_size = 1M,更大無意義社區討論指出 key_buffer_size 需設定為能容納所有索引的大小(僅對 MyISAM 生效),InnoDB 依賴 innodb_buffer_pool_size。兩者不可混淆。
Query Cache 是典型的「看似美好、實則有害」特性。除非極確定業務為低併發高重複只讀,否則生產環境請堅決關閉,將資源投入 Buffer Pool 與應用層緩存。