是否启用 MySQL query_cache_size Innodb Lock Safe?

Pro*_*ter 4 mysql innodb cache

query_cache_size一个通常会希望能像那种环境看起来这使我迷惑不解,因为它默认为0。然后我从 MySQL 文档中阅读了有关query_cache_wlock_invalidate设置的以下内容

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

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

Rol*_*DBA 7

我很高兴您询问了 InnoDB 和查询缓存。

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

除了开玩笑,我已经在 DBA StackExchange 中多次提到

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

根据有关查询缓存状态MySQL 文档

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

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

你有一些选择

选项1

您可以完全禁用查询缓存

SET GLOBAL query_cache_size = 0;
Run Code Online (Sandbox Code Playgroud)

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

[mysqld]
query_cache_size = 0;
Run Code Online (Sandbox Code Playgroud)

选项#2

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

  • 您可以提高query_cache_min_res_unit。它的默认值为 4K。如果将此值设置得更高,这将防止小结果出现在查询缓存中。这将减少查询缓存中的条目总数。
  • 您可能想要更改query_cache_limit。它的默认值为 1M。

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

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

[mysqld]
query_cache_size = 2G
query_cache_min_res_unit = 64M
query_cache_limit = 128M
Run Code Online (Sandbox Code Playgroud)

这将限制查询缓存条目的数量

  • 最少 16 个(2G / 128M)
  • 最多 32 个(2G / 64M)

如果您真的了解您的数据工作负载和吞吐量,您可以尝试限制。

您的实际问题

是否启用 MySQL query_cache_size Innodb Lock Safe ?

是的。事实上,当您将查询缓存设置得太大时,InnoDB 在这方面可能是一个真正的控制狂。虽然对此的总体答案是保留 query_cache_size = 0,但可以根据您的数据集和工作负载智能地调整它的大小。