为什么默认情况下从MySQL 5.6开始禁用query_cache_type?


28

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

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

Answers:


39

您需要InnoDB的历史以了解原因。它去了:

战争故事

InnoDB和查询缓存处于持续的战争状态。在检查InnoDB缓冲池中的更改,然后对查询缓存进行交叉检查以查找相同的更改时,InnoDB往往会非常费力。

和平协定

在MySQL 5.0之前,InnoDB的查询缓存已禁用。现在,InnoDB与之交互。为简化起见,您可以通过将query_cache_size设置为0来禁用查询缓存。

根据MySQL文档的query_cache_time

如果在将query_cache_type设置为0的情况下启动服务器,则它根本不会获取查询缓存互斥量,这意味着无法在运行时启用查询缓存,并且减少了查询执行的开销。

出让条款

query_cache_size设置为0并不是一种千篇一律的解决方案。

首先,战争的原因是开销。InnoDB将始终检查更改。更大的查询缓存将使InnoDB的工作更加困难。禁用查询缓存,让InnoDB和查询缓存感到高兴。但是,即使有这样的和平条约,您(开发人员/ DBA)也可能由于查询性能差而成为这场战争的受害者。

取决于以下

  • 工作量
  • 变化频率
  • 读取相同数据的频率

您应该将query_cache_size设置为您认为可以提高性能的任何数字(这等同于开始地下运动)。

结语

如果您想知道我是从哪里想到这个战争故事的,请参阅我的旧文章

请仔细阅读,因为我是从高性能MySQL(第2版)的第209-215页中学到的

我建议对其他人禁用查询缓存

注意:我意识到问题是关于query_cache_type的。它确实对查询缓存有影响。禁用缓存会挤压InnoDB在其上的优势。手动设置query_cache_type只会强制Developer / DBA仔细考虑查询缓存将遇到的查询类型。


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

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

2
“高性能MySQL(第2版)的209-215页”从“当查询缓存有用时”到最后一章都称为“ MySQL查询缓存”。这对应于第三版中的320-329页。
Peter V.Mørch'16


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.