我有一些很少运行的报告查询,我需要高性能而不依赖于它们在系统中的任何位置进行缓存。在测试各种模式和sproc更改时,我通常会看到第一次运行非常慢并且后续运行速度很快,所以我知道有一些缓存正在使测试更改变得很麻烦。重新启动mysqld或运行其他几个大型查询是重现它的唯一可靠方法。我想知道是否有更好的方法。
MySQL Query Cache已关闭。
监控磁盘,除了第一次运行外,我看不到任何读取操作。我对磁盘缓存并不熟悉,但我希望如果这是缓存发生的地方我仍然会看到磁盘读取,它们只是非常快。
MONyog给出了我认为最终的证据,即InnoDB缓存命中率。监控它我发现,当查询速度很快时它会触及InnoDB缓冲区,当它缓慢时就会触及磁盘。
在实时系统上,我很乐意让InnoDB这样做,但出于开发和测试的目的,我对最坏的情况感兴趣。
我在Windows Server 2008R2上使用MySQL 5.5
答案 0 :(得分:3)
我发现a post on the Percona blog说:
对于MySQL缓存,您可以重新启动MySQL,这是清除所有缓存的唯一方法。您可以使用FLUSH TABLES清理MySQL表缓存(但不是Innodb表元数据),或者可以执行“set global key_buffer_size = 0;设置全局key_buffer_size = DEFAULT“将密钥缓冲区归零,但无法重新启动就无法清理Innodb缓冲池。
他在评论中继续说:
实际上一切都有缓存。要进行真正的分析,您需要分析真实的查询混合,这将使每个查询具有适当的缓存/命中率,而不是在循环中运行一个查询并假设结果会很好。
我想总结一下。它确实使测试单个查询变得困难。我的情况是我想尝试强制使用不同的索引以确保查询规划器选择正确的索引,显然我将不得不在测试之间重新启动MySQL以使缓存脱离等式!