何时使用SQL_NO_CACHE

2022-08-30 17:47:29

我正在检查我的查询,我一直在阅读有关如何在查询中使用的文章。这让我感到困惑,因为最后每篇文章对何时使用它都有不同的结论。我读过的一篇博客说,如果你有相同的查询,你应该使用它,而且是唯一的。在另一个博客上,我读到,当你必须提取永不改变的信息时,你应该使用它。SQL_NO_CACHESELECT

有人可以解释什么时候使用这个是一个好习惯吗?我知道以前有人问过这个问题,但阅读很多文章并没有帮助,特别是当人们说在不同情况下使用这种方法时。我做了一些理论上的情况,有人可以告诉我它是否有益使用。谢谢你,我确实为一个重复的问题道歉。我真的很困惑。SQL_NO_CACHE

  1. 假设一个网站存储其配置(即网站名称,网站描述,关键字),并在每个页面上发出查询请求以提取此信息,因为每个页面都需要它。

  2. 在登录检查期间选择一个查询,该查询仅在登录检查过程中运行。userID

  3. 您从表中选择一些数据以更新表中的字段,是否应该在选择表时使用?abSQL_NO_CACHEa

谢谢。


答案 1

SQL_NO_CACHE


只需在 SELECT 语句的 SELECT 部分之后和字段列表之前添加SQL_NO_CACHE。如果启用了查询缓存并且缓存了查询,则下面的第一个查询将使用该查询缓存:

SELECT * FROM table WHERE search= 'keyword'; //lets take 1ms

下面的第二个查询将不使用查询缓存:

SELECT SQL_NO_CACHE * FROM table WHERE search= 'keyword'; //lets take ~0.2ms at 2nd time

这在对查询进行基准测试时特别有用。如果启用了查询缓存,尽管第一个查询可能需要一些时间,则第二个和后续查询几乎是即时的。通过使用SQL_NO_CACHE您可以确保不使用查询缓存,并且可以安全地比较结果时间。SQL_NO_CACHE提示关闭了MySQL针对特定查询的内置查询缓存机制。您可以通过在高度动态的查询(例如关键字搜索或仅在夜间运行的报告)上使用此提示来帮助MySQL使查询缓存更加高效。请确保查询缓存已打开,否则不需要此命令。

什么SQL_CACHE和SQL_NO_CACHE?

SQL_CACHE和SQL_NO_CACHE选项会影响查询缓存中查询结果的缓存。SQL_CACHE告诉MySQL将结果存储在查询缓存中,如果它是可缓存的,并且query_cache_type系统变量的值为2或REQUEST。使用SQL_NO_CACHE,服务器不使用查询缓存。它既不检查查询缓存以查看结果是否已缓存,也不缓存查询结果。(由于分析器中的限制,空格字符必须位于 SQL_NO_CACHE 关键字之前和之后;非空格(如换行符)会导致服务器检查查询缓存以查看结果是否已缓存。

NO_CACHE根据我的观点,如果启用了“CACHE”并且数据库中的数据是动态更新的,则可以使用,即数据库数据缓存不能被依赖,例如:存储用户密码哈希我们不能依赖CACHE,因为经常有数据更改的可能性

有用方案的更新


1)强制不使用缓存来测试查询速度


答案 2

我选择禁止缓存的最明显时间是当我不希望查询结果在缓存中时(显然?)。

如果我只运行一次查询,那么替换缓存中的数据以为永远不会从缓存中检索的数据腾出空间是没有意义的。

第二种情况是,我想运行一个低优先级查询 - 例如生成报告或部分备份 - 其中我的查询的性能并不重要,但重要的是它对数据库中发生的其他事情的中断最小(围绕缓存访问的争用存在一些问题)。

第三种情况是,当有很多简单的单表选择查询返回非常小的数据集时(例如,使用平凡的ORM)。在这种情况下,使用查询缓存可能比完全绕过它慢 - DBMS 将花费更多的时间来管理查询缓存,而不是从缓冲池/系统缓存读取数据。

正如Tot所说,缓存将扭曲任何分析/基准测试 - 但查询缓存并不是缓冲/缓存数据的唯一位置。

为了更新表 b 中的字段,请从表 a 中选择一些数据,是否应在选择表 a 时使用SQL_NO_CACHE?

不。当基础数据被修改时,缓存会自动失效(这是简单查询的大部分成本的来源)。


推荐