5

我有一个慢速数据库查询,第一次运行 18 秒,后续运行 4 秒。我正在尝试优化它的“冷启动”执行时间。但无法连续复制。

select SQL_NO_CACHE指令没有帮助。

以下命令均无法使其再次运行 18 秒:

FLUSH QUERY CACHE;
RESET QUERY CACHE;
FLUSH TABLES;

即使数据库重新启动也不会使它再次运行很长时间。

还有其他刷新缓存的命令吗?

表引擎是 InnoDB。

4

2 回答 2

9

让我解释一下为什么它没有帮助。

Your Requirement:在这里,您尝试再次运行相同的查询,但您希望它仅通过清理缓存来作为第一次运行。

当查询运行时,图片中会出现多种类型的缓存。“查询缓存”是我们谈论的最常见的缓存,然后是 MySQL 缓存(例如 Innodb 缓冲池)、table_cache(在 MySQL 级别和 InnoDB 级别)、OS 缓存、硬件缓存。

select SQL_NO_CACHE :这将阻止运行查询以保存任何“查询缓存”,这意味着如果您再次运行没有任何“查询缓存”的相同查询,但图片中将存在其他缓存。

FLUSH QUERY CACHE :这只是对“查询缓存”进行碎片整理以更好地利用其内存

RESET QUERY CACHE :从“查询缓存”中删除所有查询结果,这不会影响您在之前的所有查询中是否使用了“SQL_NO_CACHE”。

  • 除了您正在尝试的内容之外,您还可以尝试避免这些缓存。
  • 'MySQL Caches'(Innodb 缓冲池)必须重启 MySQL,没有其他方法。
  • 设置全局 key_buffer_size=0;使密钥缓冲区大小为零
  • 设置全局查询缓存类型=0;
  • 设置全局查询缓存大小=0;
  • 操作系统级缓存:这篇文章可能会对您有所帮助
于 2015-05-05T06:19:56.193 回答
0

我通常在查询中添加一个用户定义的变量,这样它就可以跳过查询缓存。不过,不确定您是否可以以这种方式模拟冷启动。

SELECT a.* 
FROM a, (SELECT @a:=NULL) as foo;
于 2013-03-07T09:58:40.640 回答