如何清除/刷新mysql innodb缓冲池?

时间:2012-05-10 22:07:33

标签: mysql sql innodb

我正在调整一个大型查询,并希望在之前和之后从相同的基线运行它,以进行比较。

我知道mysql查询缓存,但它与我无关,因为无论如何都不会缓存2个查询。

正在缓存的内容是缓冲池中的innodb页面。 有没有办法清除整个缓冲池,以便我可以比较来自同一起点的两个查询?

虽然在运行每个查询后重新启动mysql服务器无疑会起作用,我想尽可能避免这种情况

2 个答案:

答案 0 :(得分:10)

警告:以下内容仅适用于MySQL 5.5和MySQL 5.1.41+(InnoDB插件)

使用以下设置调整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

查看这些设置的定义

答案 1 :(得分:2)

更简单...... 运行两次

SELECT SQL_NO_CACHE ...;

查看第二个时间。

第一个预热buffer_pool;第二个通过SQL_NO_CACHE来避免质量控制。

因此,第二个时间表示在具有热缓存的生产系统中需要多长时间。

此外,查看处理程序计数

FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handlers%';

给出了触摸了多少行的相当清晰的图片。反过来,这可以让您对查询所花费的精力有一个很好的感觉。请注意,这可以在小数据集上非常成功(并且快速)运行。然后你可以(通常)推断出更大的数据集。

“Handler_read”可能正在读取索引行或数据行。它可能是“下一个”行(因此可能缓存在为前一行读取的块中),或者它可能是随机的(因此可能受到另一个磁盘命中)。也就是说,该技术无法帮助“需要多少块”。

这种处理程序技术不受其他事情的影响;它给出了一致的结果。

“Handler_write”表示需要一个tmp表。

近似表中行数(或其中的多个)的数字,可能表示表扫描。与LIMIT 相同的数字可能意味着您构建了一个良好的索引,它将LIMIT用于自身。

如果您确实刷新了buffer_pool,您可以观察 Innodb_buffer_pool_reads 中的更改,以便精确(?)计算 cold中读取的页数系统。这将包括非叶子索引页面,几乎总是缓存。如果系统中还有其他任何内容,则不应信任此STATUS值,因为它是“全局”,而不是“会话”。