SQL查询缓存

时间:2015-12-16 08:23:34

标签: mysql sql caching

我知道SQL查询将使用查询缓存来接收数据而不是重新处理所有数据。这是我想问的问题,

我使用数据库服务器,我是开发人员之一,我需要对我处理的查询进行性能测试

如果我清除查询缓存 使用BFLUSH QUERY CACHE;

的示例

它会影响其他开发人员,还是只会清除我的本地查询缓存?

如果它会影响其他人,有没有办法在本地清除或允许我的查询不会使用查询缓存进行测试

3 个答案:

答案 0 :(得分:2)

开始时的两个澄清:

  • MySQL查询缓存是服务器端功能,没有“本地缓存”这样的东西。您可能会对LOCAL命令中的FLUSH关键字感到困惑。正如docs解释它只是NO_WRITE_TO_BINLOG的别名(因此它与复制有关,而“本地”则表示“此服务器”)。

  • 如果您启用了该功能,MySQL将仅返回缓存数据,并将其设为默认值或选择SQL_CACHE提示。根据我的经验,大多数服务器默认没有它。

现在让我们回答你的问题。在The MySQL Query Cache,我们可以阅读:

  

查询缓存在会话之间共享,因此生成的结果集   可以发送一个客户端以响应另一个客户端发出的相同查询   客户端。

这是有道理的:无法重用存储数据的缓存不那么有用。

我不知道你想要准确测试什么。您的数据应始终保持新鲜:

  

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

但是,您可能想了解查询运行的时间。您随时可以选择退出the SQL_NO_CACHE keyword

  

服务器不使用查询缓存。它既不检查查询   缓存以查看结果是否已缓存,也不缓存   查询结果。

考虑到第二次运行的查询即使没有缓存也可能运行得更快,因为部分数据段可能已经加载到RAM中。

答案 1 :(得分:1)

尝试在查询中使用SQL_NO_CACHE选项。这将阻止MySQL缓存结果

SELECT SQL_NO_CACHE * FROM TABLE

答案 2 :(得分:1)

使用SQL Server缓存数据,您可以使用DBCC DROPCLEANBUFFERS并强制使用CHECKPOINT

但它适用于服务器(实例)级别:

  

使用DBCC DROPCLEANBUFFERS使用冷缓冲区缓存测试查询,而无需关闭并重新启动服务器。

     

要从缓冲池中删除干净缓冲区,首先使用CHECKPOINT生成冷缓冲区缓存。这会强制将当前数据库的所有脏页写入磁盘并清除缓冲区。执行此操作后,您可以发出DBCC DROPCLEANBUFFERS命令以从缓冲池中删除所有缓冲区。

编辑*

SQL查询缓冲区缓存是全局的,但不是本地的。如果缓冲区或查询缓存被丢弃,它将全局删除它,并将影响使用数据库服务器的所有用户。