看起来query_cache_size
像是人们通常想要启用的设置,这让我很困惑,因为它默认为0
。然后我读了以下关于query_cache_wlock_invalidate
设置的来自 MySQL 文档
通常,当一个客户端获取 MyISAM 表上的 WRITE 锁时,如果查询结果存在于查询缓存中,则其他客户端不会被阻止发出从表中读取的语句。将此变量设置为 1 会导致获取表的 WRITE 锁,从而使查询缓存中引用该表的任何查询无效。这会迫使尝试访问表的其他客户端在锁生效期间等待。
它没有提到 InnoDB 引擎。当 Innodb 对行/表具有写锁定时,此设置是否也会阻止从缓存读取?
答案1
我很高兴您询问有关 InnoDB 和查询缓存的问题。
恕我直言,它们不应该出现在同一个句子或同一个对话中。请原谅我在第一句话中使用了它们。
玩笑归玩笑,我曾在 DBA StackExchange 上多次讨论过
Jun 11, 2014
:增加 query_cache_size,查询速度因流量增加而大幅减慢Sep 26, 2013
:我的数据库中的查询缓存命中值没有改变Sep 05, 2012
:频繁查询缓存失效的开销是否值得?
以下是我Jun 11, 2014
关于为什么应该禁用它的帖子(有例外)
此状态发生在会话等待获取查询缓存锁时。任何需要执行查询缓存操作的语句都可能出现这种情况,例如使查询缓存无效的 INSERT 或 DELETE、查找缓存条目的 SELECT、RESET QUERY CACHE 等。
这绝对是 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-changing-in-my-database/50535#50535
你可以选择以下几种方式
选项1
您可以完全禁用查询缓存
SET GLOBAL query_cache_size = 0;
如果此后针对 InnoDB 表的所有查询都令人满意,则将其添加到my.cnf
[mysqld]
query_cache_size = 0;
选项 #2
如果你真的想要一个更大的查询缓存,也许你应该限制条目的大小
- 你可以加薪查询缓存最小解析度单位。默认值为 4K。如果将其设置得更高,这将阻止较小的结果出现在查询缓存中。这将减少查询缓存中的总条目数。
- 你可能想改变查询缓存限制. 默认是1M。
更改这些选项可以让您指定查询缓存条目的最小数量。
例如,如果您设置以下内容
[mysqld]
query_cache_size = 2G
query_cache_min_res_unit = 64M
query_cache_limit = 128M
这将限制查询缓存条目的数量
- 最少 16 个 (2G / 128M)
- 最多 32 个 (2G/64M)
如果您确实了解您的数据工作量和吞吐量,您可以尝试一下限制。
你的实际问题
启用 MySQL query_cache_size Innodb Lock 是否安全?
是的。事实上,当您将查询缓存设置得太大时,InnoDB 在这方面可能会变得非常难以控制。虽然对此的一般答案是保留 query_cache_size = 0,但您可以根据数据集和工作负载智能地调整其大小。