MySQL - 强制不使用缓存来测试查询速度

328 mysql

我正在测试MySQL中一些查询的速度.数据库正在缓存这些查询,这使我在测试这些查询的速度时难以获得可靠的结果.

有没有办法禁用查询缓存?

系统:Linux上的MySQL 4虚拟主机,我可以访问PHPMyAdmin.

谢谢

Jar*_*ott 515

尝试在查询中使用SQL_NO_CACHE(MySQL 5.7)选项.(MySQL 5.6用户点击这里)

例如.

SELECT SQL_NO_CACHE * FROM TABLE
Run Code Online (Sandbox Code Playgroud)

这将阻止MySQL缓存结果,但请注意,其他操作系统和磁盘缓存也可能会影响性能.这些更难绕行.

  • [文档](http://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html) (5认同)
  • 关于mysql查询缓存的一篇很好的文章.如何设置和查看正在运行的缓存!值得一读.http://www.databasejournal.com/features/mysql/article.php/3110171/MySQLs-Query-Cache.htm (4认同)
  • 从 MySQL 5.7.20 开始,查询缓存已被弃用,并在 MySQL 8.0 中被删除。 (4认同)
  • 在尝试提高性能之前,请尝试重新启动 mysql 服务器。可能是某个过程正在影响一切。它发生在我身上。虽然是一条与问题没有直接关系的评论,但它可以帮助很多人。 (3认同)
  • @Brett在11年回顾SalmanPK的评论.该doc页面实际上是4个句子并直接回答您的问题.如果将来删除该页面:"它既不检查查询缓存,也不检查结果是否已缓存,也不缓存查询结果." (3认同)
  • 这会阻止它缓存结果,但它是否也会阻止*使用*缓存? (2认同)

Joh*_*ter 116

另一种仅影响当前连接的替代方案:

SET SESSION query_cache_type=0;
Run Code Online (Sandbox Code Playgroud)


小智 53

对当前日期/时间的任何引用都将禁用该选择的查询缓存:

SELECT *,NOW() FROM TABLE
Run Code Online (Sandbox Code Playgroud)

请参阅"使用MySQL查询缓存的先决条件和注意事项"@ http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html


bar*_*hin 30

还有配置选项:query_cache_size = 0

要在服务器启动时禁用查询缓存,请将query_cache_size系统变量设置为0.通过禁用查询缓存代码,没有明显的开销.如果从源代码构建MySQL,则可以通过使用--without-query-cache选项调用configure来完全从服务器中排除查询缓存功能.

请参阅http://dev.mysql.com/doc/refman/5.1/en/query-cache.html


小智 24

您还可以运行follow命令来重置查询缓存.

RESET QUERY CACHE
Run Code Online (Sandbox Code Playgroud)

  • 这可能是矫枉过正的......理想情况下,您只希望MySQL暂时忽略缓存. (9认同)
  • 您还需要特殊权限. (3认同)

wbh*_*ing 19

一个问题是

SELECT SQL_NO_CACHE * FROM TABLE
Run Code Online (Sandbox Code Playgroud)

方法是它似乎只是阻止查询的结果被缓存.但是,如果您要查询正在与要测试的查询一起使用的数据库,则其他客户端可能会缓存您的查询,从而影响您的结果.我正在继续研究解决这个问题的方法,如果我找到一个,我会编辑这篇文章.


Ser*_*sta 13

我使用以下内容:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';
Run Code Online (Sandbox Code Playgroud)


new*_*ver 6

在查询中使用用户定义的变量会使查询结果不可缓存。我发现它是一个比使用更好的指标SQL_NO_CACHE。但你应该把变量放在变量设置不会严重影响性能的地方:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;
Run Code Online (Sandbox Code Playgroud)

  • “我发现它是比使用‘SQL_NO_CACHE’更好的指标。” 为何如此?似乎您需要一个非常有力的案例来对显式关键字使用晦涩的黑客攻击,除非显式关键字没有执行其声称的操作。 (4认同)