刷新InnoDB缓存

Eri*_*ill 7 mysql performance

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

MySQL Query Cache已关闭.

监视磁盘,除了第一次运行外,我没有看到任何读取.我不熟悉磁盘缓存,但我希望如果这就是缓存发生的地方我仍然会看到磁盘读取,它们只是非常快.

MONyog给了我我认为最终的证据,即InnoDB缓存命中率.监视它我看到当查询速度很快时它正在击中InnoDB缓冲区,当它缓慢时它正在击中磁盘.

在实时系统上,我很乐意让InnoDB这样做,但出于开发和测试的目的,我对最坏的情况感兴趣.

我在Windows Server 2008R2上使用MySQL 5.5

spi*_*den 4

在 Percona 博客上发现了一篇文章,内容如下:

\n\n
\n

对于 MySQL 缓存,您可以重新启动 MySQL,这是清理所有缓存的唯一方法。你可以执行 FLUSH TABLES 来清理 MySQL 表缓存(但不清理 Innodb 表元数据),或者你可以执行 \xe2\x80\x9cset global key_buffer_size=0; 设置 global key_buffer_size=DEFAULT\xe2\x80\x9d 将密钥缓冲区清零,但没有办法在不重新启动的情况下清理 Innodb 缓冲池。

\n
\n\n

在评论中他接着说:

\n\n
\n

实际上一切都有缓存。要进行真正的分析,您需要分析真正的查询组合,其中每个查询都具有适当的缓存/命中率,而不是在循环中运行一个查询并假设结果很好。

\n
\n\n

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

\n