Answers:
您需要InnoDB的历史以了解原因。它去了:
InnoDB和查询缓存处于持续的战争状态。在检查InnoDB缓冲池中的更改,然后对查询缓存进行交叉检查以查找相同的更改时,InnoDB往往会非常费力。
在MySQL 5.0之前,InnoDB的查询缓存已禁用。现在,InnoDB与之交互。为简化起见,您可以通过将query_cache_size设置为0来禁用查询缓存。
如果在将query_cache_type设置为0的情况下启动服务器,则它根本不会获取查询缓存互斥量,这意味着无法在运行时启用查询缓存,并且减少了查询执行的开销。
将query_cache_size设置为0并不是一种千篇一律的解决方案。
首先,战争的原因是开销。InnoDB将始终检查更改。更大的查询缓存将使InnoDB的工作更加困难。禁用查询缓存,让InnoDB和查询缓存感到高兴。但是,即使有这样的和平条约,您(开发人员/ DBA)也可能由于查询性能差而成为这场战争的受害者。
取决于以下
您应该将query_cache_size设置为您认为可以提高性能的任何数字(这等同于开始地下运动)。
如果您想知道我是从哪里想到这个战争故事的,请参阅我的旧文章
Sep 05, 2012
:频繁查询缓存失效的开销是否值得?请仔细阅读,因为我是从高性能MySQL(第2版)的第209-215页中学到的
我建议对其他人禁用查询缓存
Sep 25, 2013
:使查询缓存条目(键)无效Sep 26, 2013
:查询缓存命中值在我的数据库中未更改Dec 23, 2013
:具有较高CPU和内存使用率的MySQL注意:我意识到问题是关于query_cache_type的。它确实对查询缓存有影响。禁用缓存会挤压InnoDB在其上的优势。手动设置query_cache_type只会强制Developer / DBA仔细考虑查询缓存将遇到的查询类型。
我有一篇博客文章解释了为什么在这里。
简短版: 查询缓存导致多核计算机上的可伸缩性问题。因此,现在默认情况下禁用它。
为了完成答案,Oracle推动“替换”查询缓存功能的是memcached集成。