禁用mysql缓存

时间:2012-07-31 18:38:15

标签: mysql caching

我需要禁用mysql查询缓存来测试查询速度。我已经尝试了以下但没有成功

  1. 从表
  2. 中选择SQL_NO_CACHE col1,col2
  3. 使配置变量query_cache_size为0 并且'query_cache_type'为OFF 所以所有的qcache变量都显示为零 显示状态如'%qcache%';
    Qcache_free_blocks 0 Qcache_free_memory 0 Qcache_hits 0 Qcache_inserts 0 Qcache_lowmem_prunes 0 Qcache_not_cached 0 Qcache_queries_in_cache 0 Qcache_total_blocks 0
  4. 3.used'reset query cache','flush query cache',flush tables;太 但我的查询仍然比第一次运行得更快,这意味着它正在缓存。

    4.所有qcache变量始终为零。 我错过了什么?请帮忙。

2 个答案:

答案 0 :(得分:3)

您观察到相同查询的后续执行运行得更快并不一定意味着正在缓存查询结果,或者从查询缓存中返回查询的后续执行。

可能是在第一次执行查询时,必须访问的索引和/或数据块不在InnoDB缓冲池或MyISAM密钥缓存中,并且必须从磁盘检索。这些块将保留在InnoDB缓冲池中,MyISAM密钥缓存完全独立于MySQL查询缓存。如果这些块仍在内存中,那么对这些块的后续访问可以更快地返回。


通常,您不希望从InnoDB缓冲池或MyISAM密钥缓存中刷新块以测量性能。相反,您希望多次运行查询,并抛弃第一次执行的时间。

如果你想在InnoDB缓冲池或MyISAM密钥缓存中没有块开始,那么关闭并重新启动MySQL服务器。

但即使这些块不在InnoDB缓冲池或MyISAM密钥缓存中,这些块很可能仍然在OS文件系统缓存中的“内存”中。因此,为了确保从磁盘读取块,您还需要刷新OS文件系统缓存。


以下是Tom Kyte(AskTom)关于Oracle的文章的摘录,但同样的推理也适用于其他RDBMS系统(包括MySQL)。

http://www.oracle.com/technetwork/issue-archive/o43asktom-094944.html

刷新缓存

问:有没有办法刷新[缓冲区缓存]? ...这对于一个接一个地尝试了几个方法的调优练习很重要,但是我们希望在不重新启动数据库的情况下减少缓冲区中预先存在的块的影响。

答:实际上,调整工具不能这样做很重要。运行测试,忽略结果,然后运行两到三次并平均掉这些结果非常重要。在现实世界中,缓冲区缓存永远不会缺乏结果。决不。调优时,您的目标是减少逻辑I / O(LIO),因为物理I / O(PIO)将自行处理。

考虑一下:刷新共享池和缓冲区缓存比不刷新它们更加人为。我怀疑,大多数人似乎对此持怀疑态度,因为它在传统智慧面前飞逝。我将告诉你如何做到这一点,但不是这样你可以用它来测试。相反,我将用它来证明为什么它是徒劳无功且完全是人为的(因此会导致错误的假设)。我刚刚启动了我的电脑,并且我已经针对一张大桌子运行了这个查询。我“刷新”缓冲区缓存并再次运行它:

答案 1 :(得分:0)

这是在Linux上吗? 还可以尝试刷新操作系统磁盘缓存:

$ sync && sysctl -w vm.drop_caches = 3

请参阅this post