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

Yog*_*oga 27 mysql mysql-5 mysql-5.6 query-cache

我们已经升级到 MySQL 5.6 并且开始看到 db server 的负载显着增加,最后发现 query_cache_type从 5.6 开始默认为 off start。

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

Rol*_*DBA 38

您需要了解 InnoDB 的历史才能了解原因。它是这样的:

战争故事

InnoDB 和查询缓存一直处于战争状态。InnoDB 在检查 InnoDB 缓冲池中的更改,然后交叉检查查询缓存中的相同更改时,往往会非常严厉。

和平协定

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

根据有关 query_cache_timeMySQL 文档

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

投降条款

query_cache_size设置为 0 并不是一刀切的解决方案。

首先,战争的原因是开销。InnoDB 将始终检查更改。更大的查询缓存将使 InnoDB 的工作更加困难。禁用查询缓存让 InnoDB 和查询缓存满意。但是,即使有这样的和平条约,您(开发人员/DBA)也可能因查询性能不佳而成为这场战争的牺牲品。

取决于以下

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

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

结语

如果你想知道我从哪里想出这个战争故事,请看我的旧帖子

请仔细阅读,因为我是从High Performance MySQL (2nd Edition) 的第 209-215 页学到的

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

注意:我意识到问题是关于query_cache_type 的。它确实对查询缓存有影响。禁用缓存会削弱 InnoDB 对其的支配地位。手动设置query_cache_type只是强制开发人员/DBA 仔细考虑查询缓存将遇到的查询类型。

  • 如果只有更多这样的帖子读起来就好了(感谢有趣的比喻)!我敢打赌 Rolando 的幸运孩子每天晚上都会被告知这样的 MySQL 睡前故事!;) (4认同)
  • “High Performance MySQL (2nd Edition)的第 209-215 页”指的是名为“The MySQL Query Cache”的一章,从“When the Query Cache Is Helpful”到最后。这对应于第 3 版中的第 320-329 页。 (2认同)

Mor*_*ker 8

我有一篇博客文章解释了为什么会在这里

简短版本: 查询缓存会导致多核机器上的可扩展性问题。所以它现在默认是禁用的。