看起来像是人们通常希望启用的query_cache_size
那种设置,这让我感到困惑,因为它默认为0
. 然后我从 MySQL 文档中阅读了有关query_cache_wlock_invalidate
设置的以下内容
通常,当一个客户端在 MyISAM 表上获得 WRITE 锁时,如果查询结果存在于查询缓存中,则不会阻止其他客户端发出从表中读取的语句。将此变量设置为 1 会导致获取表的 WRITE 锁,以使查询缓存中引用该表的任何查询无效。这会强制其他尝试访问该表的客户端在锁定生效时等待。
它没有提到 InnoDB 引擎。当 Innodb 在行/表上有写锁时,此设置是否也阻止从缓存中读取?
我很高兴您询问了 InnoDB 和查询缓存。
恕我直言,他们永远不应该出现在同一个句子或同一个对话中。请原谅我在第一句话中使用它们。
不开玩笑了,我在 DBA StackExchange 上讲过很多次
Jun 11, 2014
:增加 query_cache_size,随着流量的增加,查询速度急剧下降Sep 26, 2013
:查询缓存命中值在我的数据库中没有改变Sep 05, 2012
:频繁查询缓存失效的开销值得吗?这是我
Jun 11, 2014
关于为什么应该禁用它的帖子(有例外)根据查询缓存状态的 MySQL 文档
这对于 InnoDB 表来说绝对是一个大问题,因为 InnoDB 机制侵入了查询缓存。我之前写过这个现象
Sep 05, 2012
:https ://dba.stackexchange.com/questions/23699/is-the-overhead-of-frequent-query-cache-invalidation-ever-worth-it/23727#23727Sep 26, 2013
:https ://dba.stackexchange.com/questions/50290/query-cache-hit-value-is-not-sharing-in-my-database/50535#50535您有一些选择
选项1
您可以完全禁用查询缓存
如果此后对 InnoDB 表的所有查询都令人满意,则将其添加到
my.cnf
选项 #2
如果您真的想要更大的查询缓存,也许您应该限制条目的大小
更改这些选项可以让您指定查询缓存条目的最小数量。
例如,如果您设置以下
这将限制查询缓存条目的数量
如果您真的了解您的数据工作量和吞吐量,您可以尝试这些限制。
您的实际问题
是的。实际上,当您将查询缓存设置得太大时,InnoDB 在这方面可以成为真正的控制狂。虽然对此的总括答案是保留 query_cache_size = 0,但可以根据您的数据集和工作负载智能地调整它的大小。