【问题标题】:Flush InnoDB cache刷新 InnoDB 缓存
【发布时间】:2011-09-10 17:31:57
【问题描述】:

我有一些很少运行的报告查询,我需要在不依赖它们被缓存在系统中的任何位置的情况下保持高性能。在测试各种模式和存储过程更改时,我通常会看到第一次运行非常慢,随后运行很快,所以我知道有一些缓存正在进行,这使得测试更改变得很麻烦。重新启动 mysqld 或运行其他几个大型查询是重现它的唯一可靠方法。我想知道是否有更好的方法。

MySQL 查询缓存已关闭。

监控磁盘,除了第一次运行,我没有看到任何读取发生。我对磁盘缓存不是很熟悉,但我希望如果缓存发生在那里,我仍然会看到磁盘读取,它们会非常快。

MONyog 给了我我认为是权威的证据,那就是 InnoDB 缓存命中率。监控它,我发现当查询速度快时它会访问 InnoDB 缓冲区,当查询速度慢时它会访问磁盘。

在实时系统上,我很乐意让 InnoDB 执行此操作,但出于开发和测试目的,我对最坏的情况感兴趣。

我在 Windows Server 2008R2 上使用 MySQL 5.5

【问题讨论】:

    标签: mysql performance


    【解决方案1】:

    我发现a post on the Percona blog 说:

    对于 MySQL 缓存,您可以重新启动 MySQL,这是清除所有缓存的唯一方法。您可以执行 FLUSH TABLES 来清理 MySQL 表缓存(但不是 Innodb 表元数据),或者您可以执行“set global key_buffer_size=0;将 global key_buffer_size=DEFAULT” 设置为零键缓冲区,但没有重新启动就无法清理 Innodb 缓冲池。

    在 cmets 中他接着说:

    几乎所有东西都有缓存。要进行真正的分析,您需要分析真正的查询组合,这将使每个查询都具有适当的缓存/命中率,而不是在循环中运行一个查询并假设结果会很好。

    我想总结一下。它确实使测试单个查询变得困难。我的情况是,我想尝试强制使用不同的索引以确保查询计划器选择正确的索引,显然我必须在测试之间重新启动 MySQL 才能将缓存排除在外!

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 2016-08-31
      • 2017-01-06
      相关资源
      最近更新 更多