何时使用SQL_NO_CACHE

时间:2013-09-13 03:48:38

标签: php mysql sql optimization

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

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

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

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

  3. 如果您在表a选择中使用b,则可以从表SQL_NO_CACHE中选择一些数据以更新表a中的字段?

  4. 谢谢。

5 个答案:

答案 0 :(得分:8)

<强> 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或DEMAND)。使用SQL_NO_CACHE,服务器不使用查询缓存。它既不检查查询缓存,也不检查结果是否已缓存,也不缓存查询结果。 (由于解析器中的限制,空格字符必须位于SQL_NO_CACHE关键字之前和之后;非空格(如换行符)会导致服务器检查查询缓存以查看结果是否已缓存。)

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

有用方案的更新


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

答案 1 :(得分:4)

为了回答您的问题,您首先必须了解MySQL查询缓存的工作原理。可以找到关于此问题的非常好的文章here。关键方面是缓存是synchronized with the data

  

查询缓存不会返回陈旧数据。修改表格时   刷新查询缓存中的任何相关条目。

在您的用例中,我没有找到任何不使用SQL_NO_CACHE查询缓存的真正目的。有一些原因,比如分析或避免将大数据写入有限的查询缓存以使用此选项,但我不认为这是这种情况。

答案 2 :(得分:4)

我选择抑制缓存的最明显的时间是我不希望缓存中的查询结果(很明显?)。

如果我只运行一次查询,则无需替换当前缓存中的数据,以便为永远不会从缓存中检索的数据腾出空间。

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

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

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

  

如果在select a for table a上使用SQL_NO_CACHE,那么从表a中选择一些数据以更新表b中的字段?

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

答案 3 :(得分:1)

我使用它的唯一时间是分析查询(EXPLAIN extended...)。

多次运行查询时(一个非常重要的“预热”服务器),它将被缓存,因此探查器将输出错误的结果。

根据具体情况,我也使用:

SET SESSION query_cache_type = OFF

答案 4 :(得分:1)

关于这个问题的答案是有效的;然而,从 MySQL 5.7.20 开始,查询缓存已经贬值了。有关详细信息,请参阅 MySQL Documentation

相关问题