20 php mysql sql optimization
我正在查看我的查询,我一直在阅读有关如何SQL_NO_CACHE在SELECT查询中使用的文章.这使我感到困惑,因为最后每篇文章对何时使用它都有不同的结论.我读过的一篇博客说,如果你有相同的查询,你应该使用它,并且是唯一的.在另一篇博客上,我读到当你必须提取永不改变的信息时,你应该使用它.
有人可以解释什么时候使用它是一个好习惯吗?我知道之前有人问过,但阅读很多文章并没有帮助,特别是当人们说在不同情况下使用这种方法时.我做了一些理论情况,有人可以告诉我它是否有益于使用SQL_NO_CACHE.谢谢,我为一个重复的问题道歉.我真的很困惑.
假设网站存储其配置(即网站名称,网站描述,关键字),并在每个页面上发出查询请求,以便在每个页面上提取此信息.
userID在登录检查期间选择a ,查询仅在登录检查过程中运行.
如果您在select for table上使用,则从表a中选择一些数据以更新表中的字段?bSQL_NO_CACHEa
谢谢.
7-i*_*bad 10
SQL_NO_CACHE
只需在SELECT语句的SELECT部分之后和字段列表之前添加SQL_NO_CACHE.如果启用了查询缓存并且缓存了查询,则下面的第一个查询将使用查询缓存:
SELECT * FROM table WHERE search= 'keyword'; //lets take 1ms
Run Code Online (Sandbox Code Playgroud)
下面的第二个查询将不使用查询缓存:
SELECT SQL_NO_CACHE * FROM table WHERE search= 'keyword'; //lets take ~0.2ms at 2nd time
Run Code Online (Sandbox Code Playgroud)
这在对查询进行基准测试时特别有用; 如果启用查询缓存,尽管第一个查询可能需要一些时间,第二个和后续查询几乎是即时的.通过使用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)强制不使用缓存来测试查询速度
我选择抑制缓存的最明显时间是我不希望查询结果出现在缓存中(显然吗?)。
如果我只运行一次查询,那么就没有必要替换当前缓存中的数据以为永远不会从缓存中取回的数据腾出空间。
第二种情况是我要运行低优先级查询(例如,生成报告或部分备份),在这种情况下,我的查询性能并不重要,但对于数据库中发生的其他事件,它的破坏性要最小(围绕缓存访问的争用存在一些问题)。
第三种情况是,当有许多简单的单表选择查询返回非常小的数据集时(例如,使用琐碎的ORM)。在这种情况下,使用查询缓存可能比完全绕过查询缓存要慢-与从缓冲池/系统缓存中读取数据相比,DBMS将花费更多的时间来管理查询缓存。
正如Tot所说,缓存将歪曲任何配置文件/基准测试-但是查询缓存并不是唯一的数据被缓存/缓存的地方。
您从表a中选择一些数据以更新表b中的字段,是否应该在表a的select上使用SQL_NO_CACHE?
不会。修改基础数据后,缓存会自动失效(这是简单查询的大部分费用都来自于此)。
我唯一一次使用它是在分析查询时 ( EXPLAIN extended...)。
当多次运行查询时(“预热”服务器的一个非常重要的步骤),它将被缓存,因此探查器将输出错误的结果。
根据情况我也使用:
SET SESSION query_cache_type = OFF