【问题标题】:MySQL flush query cacheMySQL刷新查询缓存
【发布时间】:2023-03-23 00:26:01
【问题描述】:

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

select SQL_NO_CACHE 指令没有帮助。

以下命令都不能让它再次运行 18 秒:

FLUSH QUERY CACHE;
RESET QUERY CACHE;
FLUSH TABLES;

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

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

表引擎是 InnoDB。

【问题讨论】:

  • 什么表引擎有问题?
  • 表引擎是 InnoDB
  • 也尝试清空 innodb 缓冲池。另一方面,为什么不让查询正常运行呢?
  • 安德烈,现在尝试:没有帮助。

标签: mysql performance query-cache


【解决方案1】:

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

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

当查询运行时,图片中会出现多种类型的缓存。 'Query Cache' 是我们谈论的最常见的缓存,然后是 MySQL Caches(例如 Innodb Buffer Pool)、table_cache(在 MySQL 级别和 InnoDB 级别)、OS Caches、Hardware Cache。

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

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

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

  • 除了您正在尝试的之外,您还可以尝试避免这些缓存。
  • “MySQL 缓存”(Innodb 缓冲池)必须重新启动 MySQL,那里 没有别的办法。
  • 设置全局key_buffer_size=0;使密钥缓冲区大小为零
  • 设置全局 query_cache_type=0;
  • 设置全局 query_cache_size=0;
  • 操作系统级缓存:this 帖子可能对您有所帮助

【讨论】:

    【解决方案2】:

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

    SELECT a.* 
    FROM a, (SELECT @a:=NULL) as foo;
    

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2014-06-25
      • 2015-02-05
      • 2012-08-20
      相关资源
      最近更新 更多