我有一些很少运行的报告查询,我需要保证它们的性能,而不依赖于将它们缓存在系统中的任何位置。在测试各种模式和存储过程更改时,我通常会看到第一次运行非常慢,而后续运行速度很快,所以我知道正在进行一些缓存,这使得测试更改变得很麻烦。重新启动 mysqld 或运行其他几个大型查询是重现它的唯一可靠方法。我想知道是否有更好的方法。
MySQL 查询缓存已关闭。
监视磁盘,除了第一次运行之外,我没有看到任何读取发生。我对磁盘缓存不太熟悉,但我希望如果这是缓存发生的地方,我仍然会看到磁盘读取,它们会非常快。
MONyog 给了我我认为是决定性的证据,那就是 InnoDB 缓存命中率。监视它,我发现当查询速度快时,它会命中 InnoDB 缓冲区,当查询速度慢时,它会命中磁盘。
在实时系统上,我很乐意让 InnoDB 执行此操作,但出于开发和测试目的,我对最坏的情况感兴趣。
我在 Windows Server 2008R2 上使用 MySQL 5.5
I found Percona 博客上的帖子 http://www.mysqlperformanceblog.com/2007/09/12/query-profiling-with-mysql-bypassing-caches/%20%22this%20post%20on%20the%20Percona%20blog%22%20that%20answers%20the%20question%3a说的是:
对于 MySQL 缓存,您可以重新启动 MySQL,这是清理所有缓存的唯一方法。你可以执行 FLUSH TABLES 来清理 MySQL 表缓存(但不清理 Innodb 表元数据),或者你可以执行“set global key_buffer_size=0;”设置全局 key_buffer_size=DEFAULT” 将密钥缓冲区归零,但没有办法在不重新启动的情况下清理 Innodb 缓冲池。
在评论中他接着说:
实际上一切都有缓存。要进行真正的分析,您需要分析真正的查询组合,其中每个查询都具有适当的缓存/命中率,而不是在循环中运行一个查询并假设结果很好。
我想这就是总结。它确实使测试单个查询变得困难。我的情况是,我想尝试强制使用不同的索引,以确保查询规划器选择正确的索引,显然我必须在测试之间重新启动 MySQL,以将缓存排除在外!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)