我们已经升级到MySQL 5.6,开始看到数据库服务器的负载显着增加,最后发现query_cache_type默认从5.6开始关闭。

我们再次启用它,看到加载减少,为什么默认情况下从MySQL 5.6开始禁用此值?我看不到启用它的问题。

#1 楼

您需要InnoDB的历史以了解原因。结果如下:
战争故事
InnoDB和查询缓存处于持续的战争状态。在检查InnoDB缓冲池中的更改,然后交叉检查查询缓存中是否存在相同的更改时,InnoDB往往会非常费力。现在,InnoDB与之交互。为简化起见,您可以通过将query_cache_size设置为0来禁用查询缓存。
根据query_cache_time上的MySQL文档

如果服务器是在query_cache_type设置为0的情况下启动的,根本不获取查询缓存互斥量,这意味着无法在运行时启用查询缓存,并且减少了查询执行的开销。
将query_cache_size设置为0并非如此一个千篇一律的解决方案。
战争的首要原因是开销。 InnoDB将始终检查更改。更大的查询缓存将使InnoDB的工作更加困难。禁用查询缓存,让InnoDB和查询缓存感到高兴。但是,即使有这样的和平条约,您(开发人员/数据库管理员)也可能由于查询性能差而陷入这场战争。
取决于以下内容

工作量
更改频率
读取相同数据的频率

您应该将query_cache_size设置为您认为可以提高性能的任何数字(这等同于开始地下运动)。
EPILOGUE
如果您想知道我从哪里想到这个战争故事,请参阅我的旧帖子


Sep 05, 2012:频繁查询缓存失效的开销值得吗?


请仔细阅读,因为我是从高性能MySQL(第二版)的209-215页中学到的。 br />
Sep 25, 2013:使查询缓存项(键)无效


Sep 26, 2013:查询缓存命中值在我的数据库中未更改


Dec 23, 2013:具有较高CPU和内存使用率的MySQL


注意:我意识到问题是关于query_cache_type的。它确实对查询缓存有影响。禁用缓存将使InnoDB占据主导地位。手动设置query_cache_type只会强制Developer / DBA仔细考虑查询缓存将遇到的查询类型。

评论


嗨,我已经阅读了您所有的链接。实际上,我试图再次关闭查询缓存,并且我们看到负载再次显着增加..所以我们需要再次打开。我并不是说您说的是错误的,也许只是我们的应用程序读取量很大,查询缓存对于减少负载非常有用。.(我们的网站运行的是WordPress)

–瑜伽
2014年6月9日14:21



如果只有更多的SO帖子像这样阅读(感谢您的有趣类推)!我敢打赌,Rolando的幸运孩子每天晚上都会被告知这样的MySQL睡前故事! ;)

– rinogo
2015年9月9日20:20在

“高性能MySQL(第2版)的209-215页”从“当查询缓存有用时”到末尾指的是称为“ MySQL查询缓存”的一章。这对应于第三版中的320-329页。

– Peter V.Mørch
16年1月12日在15:04

@PeterV.Mørch这就是为什么我在回答中说的原因,具体取决于以下工作负载,更改频率,读取相同数据的频率,应将query_cache_size设置为您认为可以提高性能的任何数字(这等同于开始地下运动)。对于MySQL 5.x,调优查询缓存不适合胆小的人。您必须知道您的数据。无论如何,在MySQL 8.0中不需要进行调整。

– RolandoMySQLDBA
20年6月13日在17:02

#2 楼

我有一篇博客文章解释了为什么会出现这种情况。

简短版本:
查询缓存会导致多核计算机上的可伸缩性问题。因此,默认情况下它现在处于禁用状态。

评论


作为我帖子的后续内容,斯图尔特·史密斯(Stewart Smith)将影响描述为“一个数量级”,更糟糕的是flamingspork.com/blog/2014/06/05/…

–摩根·托克(Morgan Tocker)
2014年6月9日在17:06

#3 楼

为了完成答案,Oracle推动“替换”查询缓存功能的是memcached集成。