选项1

选项1

看起来query_cache_size像是人们通常想要启用的设置,这让我很困惑,因为它默认为0。然后我读了以下关于query_cache_wlock_invalidate设置的来自 MySQL 文档

通常,当一个客户端获取 MyISAM 表上的 WRITE 锁时,如果查询结果存在于查询缓存中,则其他客户端不会被阻止发出从表中读取的语句。将此变量设置为 1 会导致获取表的 WRITE 锁,从而使查询缓存中引用该表的任何查询无效。这会迫使尝试访问表的其他客户端在锁生效期间等待。

它没有提到 InnoDB 引擎。当 Innodb 对行/表具有写锁定时,此设置是否也会阻止从缓存读取?

答案1

我很高兴您询问有关 InnoDB 和查询缓存的问题。

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

玩笑归玩笑,我曾在 DBA StackExchange 上多次讨论过

以下是我Jun 11, 2014关于为什么应该禁用它的帖子(有例外)

根据MySQL 查询缓存状态文档

此状态发生在会话等待获取查询缓存锁时。任何需要执行查询缓存操作的语句都可能出现这种情况,例如使查询缓存无效的 INSERT 或 DELETE、查找缓存条目的 SELECT、RESET QUERY CACHE 等。

这绝对是 InnoDB 表的一个大问题,因为 InnoDB 机制使得进展查询缓存。我之前写过关于这个现象的文章

你可以选择以下几种方式

选项1

您可以完全禁用查询缓存

SET GLOBAL query_cache_size = 0;

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

[mysqld]
query_cache_size = 0;

选项 #2

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

更改这些选项可以让您指定查询缓存条目的最小数量。

例如,如果您设置以下内容

[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,但您可以根据数据集和工作负载智能地调整其大小。

相关内容