MySQL清除查询缓存

6

我有一个数据库查询效率很慢,第一次运行需要18秒钟,而随后的每次运行只需要4秒钟。我正在尝试优化它的“冷启动”执行时间,但是无法连续复现。

select SQL_NO_CACHE指令没有起到改善作用。

以下任何命令都无法使其再次运行18秒钟:

FLUSH QUERY CACHE;
RESET QUERY CACHE;
FLUSH TABLES;

即使重新启动数据库,也不能使其长时间运行。

是否有其他命令可以清空缓存?

表引擎是InnoDB。


问题中使用的是哪个表引擎? - N.B.
表引擎是InnoDB。 - Bogdan Gusiev
尝试清空InnoDB缓冲池。另一方面,为什么不让查询正常运行呢? - N.B.
1
你尝试过这个吗?https://dev59.com/AmPVa4cB1Zd3GeqP8LWT - André Ricardo
安德烈,现在尝试了:没有帮助。 - Bogdan Gusiev
很可能在后续运行中提高的性能并不是来自查询缓存,而是来自系统中各种磁盘和索引级别的缓存。 - Charles
2个回答

9
让我解释一下为什么它没有起到帮助作用。
您的要求:在此,您尝试再次运行相同的查询,但您希望它只执行一次并清除缓存。
当查询运行时,会涉及多种类型的缓存。 “查询缓存”是我们谈论最多的缓存,然后还有MySQL缓存(例如Innodb缓冲池),table_cache(MySQL级别和InnoDB级别),操作系统缓存和硬件缓存。
“select SQL_NO_CACHE”:这将防止运行查询保存任何“查询缓存”,这意味着如果您再次运行相同的查询,则不会有任何“查询缓存”,但其他缓存仍将出现。
“FLUSH QUERY CACHE”:这只是对“查询缓存”进行碎片整理,以更好地利用其内存。
“RESET QUERY CACHE”:从“查询缓存”中删除所有查询结果,这不会影响您之前使用“SQL_NO_CACHE”的所有查询。
除了您正在尝试的内容外,您还可以尝试一些其他方法来避免这些缓存。 必须重启MySQL以清除'MySQL Caches'(Innodb Buffer Pool),没有其他方法。 设置全局key_buffer_size=0; 以让键缓冲区大小为零。 设置全局query_cache_type=0; 设置全局query_cache_size=0; 操作系统级缓存:this 这篇文章可能会对您有所帮助。

0
通常我会将一个用户定义变量添加到查询中,这样它就可以跳过查询缓存。但不确定能否以这种方式模拟冷启动。
SELECT a.* 
FROM a, (SELECT @a:=NULL) as foo;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接