如何清除/刷新mysql innodb缓冲池?
我正在优化一个大型查询,并希望在前后从同一基线运行它以进行比较 我知道mysql查询缓存,但它与我无关,因为这两个查询无论如何都不会被缓存 缓存的是缓冲池中的innodb页面。 有没有办法清除整个缓冲池,以便从同一起点比较两个查询如何清除/刷新mysql innodb缓冲池?,mysql,sql,innodb,Mysql,Sql,Innodb,我正在优化一个大型查询,并希望在前后从同一基线运行它以进行比较 我知道mysql查询缓存,但它与我无关,因为这两个查询无论如何都不会被缓存 缓存的是缓冲池中的innodb页面。 有没有办法清除整个缓冲池,以便从同一起点比较两个查询 运行每个查询后重新启动mysql服务器无疑会起作用,但如果可能的话,我想避免这种情况。警告:以下仅适用于mysql 5.5和mysql 5.1.41+(InnoDB插件) t使用以下设置查看InnoDB缓冲池中条目的持续时间: SET GLOBAL innodb_ol
运行每个查询后重新启动mysql服务器无疑会起作用,但如果可能的话,我想避免这种情况。警告:以下仅适用于mysql 5.5和mysql 5.1.41+(InnoDB插件) t使用以下设置查看InnoDB缓冲池中条目的持续时间:
SET GLOBAL innodb_old_blocks_time=250; // This is 0.25 seconds
SET GLOBAL innodb_old_blocks_pct=5;
SET GLOBAL innodb_max_dirty_pages_pct=0;
完成测试后,将其设置回默认值:
SET GLOBAL innodb_old_blocks_time=0;
SET GLOBAL innodb_old_blocks_pct=37;
SET GLOBAL innodb_max_dirty_pages_pct=90; // 75 for MySQL 5.5/MySQL 5.1 InnoDB Plugin
查看这些设置的定义
- MySQL 5.5
- MySQL 5.1.41+
- 简单得多运行此操作两次
SELECT SQL_NO_CACHE ...;
看看第二次计时
第一种方法使缓冲池升温;第二种方法通过使用SQL\u NO\u缓存来避免QC。(在MySQL 8.0中,关闭SQL\u NO\u缓存
;它不存在了。)
因此,第二个计时很好地指示了使用热缓存的生产系统需要多长时间
此外,查看处理器计数
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handlers%';
给出了一个相当清晰的图片,显示了触摸了多少行。这反过来会让您很好地了解查询需要付出多少努力。请注意,这可以在小型数据集上非常成功地(快速地)运行。然后你可以(经常)外推到更大的数据集
“Handler\u read”可能正在读取索引行或数据行。它可能是“下一行”(因此可能缓存在为前一行读取的块中),也可能是随机的(因此可能受到另一次磁盘命中)。也就是说,该技术在“需要多少块”方面帮助不大
这种处理技术不受其他情况的影响;它给出了一致的结果
“Handler_write”表示需要一个tmp表
近似于表中行数的数字(或其倍数)可能表示表扫描。一个与LIMIT
相同的数字可能意味着您建立了一个非常好的索引,它将LIMIT
消耗到自身中
如果确实刷新了缓冲池,则可以监视Innodb缓冲池读取的更改,以精确计算冷系统中读取的页数。这将包括非叶索引页,它们几乎总是被缓存的。如果系统中发生任何其他情况,则不应信任此状态
值,因为它是“全局”值,而不是“会话”值。回答得很好,谢谢。不过我有个问题。。。当缓冲区页面过期时,是否只是将其标记为已删除?我只是想确保没有一些innodb线程在运行,它们会定期修剪过期的缓冲区页(由于超时时间太低,可能会在数据库上造成更大的负载)我知道这只是暂时的测试,但我需要很好地处理这些特殊的问题benchmarks@Rolando,如果我运行许多其他程序,并且需要MySQL使用尽可能少的RAM,这是否意味着我应该将innodb缓冲池设置为零?或者有最低要求的数量吗?只是一个旁注,SQL\u NO\u CACHE
对MySQL 8没有影响,查询缓存被删除,并且SQL\u CACHE
修饰符也被删除。@Ander-谢谢。我喜欢让答案保持最新,所以我在一个注释中添加了编辑的内容。