正在启用MySQL query_cache_size Innodb Lock Safe?

query_cache_size看起来就像人们通常想要启用的那种设置,因为它默认为0所以我感到困惑。 然后我从MySQL文档中阅读以下关于query_cache_wlock_invalidate设置

通常,当一个客户端在MyISAM表上获得一个WRITE锁时,如果查询结果存在于查询caching中,则其他客户端不会发出从该表读取的语句。 将此variables设置为1将导致获取表的WRITE锁,以使查询caching中引用该表的任何查询无效。 这会强制其他尝试访问该表的客户端在locking生效时等待。

它没有提到InnoDB引擎。 当Innodb在行/表上写入locking时,此设置是否也会阻止从caching中读取数据?

我很高兴你问到InnoDB和查询caching。

恕我直言,他们不应该出现在同一句话或同一个谈话。 请原谅我在第一句中使用他们。

除了所有的开玩笑,我已经在DBA StackExchange中多次谈到

  • Jun 11, 2014 : 增加了query_cache_size,查询速度急剧增加,stream量增加
  • Sep 26, 2013 : 查询caching命中值在我的数据库中没有改变
  • Sep 05, 2012 : 频繁查询caching失效开销是否值得?

这是我的Jun 11, 2014post,为什么它应该被禁用(有例外)

根据关于查询caching状态的MySQL文档

当会话正在等待采取查询cachinglocking时,会发生此状态。 对于任何需要执行某些查询caching操作的语句(例如,使查询caching无效的INSERT或DELETE,查找caching条目的SELECT,RESET QUERY CACHE等等),都可能发生这种情况。

这对于InnoDB表来说肯定是一个巨大的问题,因为InnoDB机制在查询caching中占据了主导地位 。 我之前曾经写过这个现象

  • Sep 05, 2012 : https : //dba.stackexchange.com/questions/23699/is-the-overhead-of-frequent-query-cache-invalidation-ever-worth-it/23727#23727
  • Sep 26, 2013 : https : //dba.stackexchange.com/questions/50290/query-cache-hit-value-is-not-changing-in-my-database/50535#50535

这里有一些选项

选项1

您可以完全禁用查询caching

 SET GLOBAL query_cache_size = 0; 

如果所有针对InnoDB表的查询都很满意,则将其添加到my.cnf

 [mysqld] query_cache_size = 0; 

选项#2

如果你真的想要一个更大的查询caching,也许你应该限制条目的大小

  • 你可以提出query_cache_min_res_unit 。 它的默认值是4K。 如果将此设置得更高,则会阻止查询caching中出现小的结果。 这将减less查询caching中的条目总数。
  • 您可能想要更改query_cache_limit 。 它的默认值是1M。

更改这些选项可以允许您指定查询caching条目的最小数量。

例如,如果您设置以下

 [mysqld] query_cache_size = 2G query_cache_min_res_unit = 64M query_cache_limit = 128M 

这将限制查询caching条目的数量

  • 最less16(2G / 128M)
  • 最大32(2G / 64M)

如果你真的知道你的数据工作量和吞吐量,你可以尝试一下这个限制。

您的实际问题

正在启用MySQL query_cache_size Innodb Lock Safe?

是的。 事实上,当你使查询caching过大时,InnoDB在这方面可能是一个真正的控制怪胎。 虽然这一切的答案是离开query_cache_size = 0,可以智能地为您的数据集和工作量调整它的大小。