【问题标题】:how to clear/flush mysql innodb buffer pool?如何清除/刷新 mysql innodb 缓冲池?
【发布时间】:2012-05-19 13:09:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mysql sql innodb


    【解决方案1】:

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

    使用以下设置调整 InnoDB 缓冲池中条目的持续时间:

    // This is 0.25 seconds
    SET GLOBAL innodb_old_blocks_time=250; 
    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
    

    查看这些设置的定义

    【讨论】:

    • 很好的答案,谢谢。我只是有一个问题......当缓冲区页面过期时,它是否只是被标记为已删除?我只是想确保没有一些 innodb 线程在运行,它会定期修剪过期的缓冲区页面(并且可能会在数据库上创建更大的负载,因为超时太低了)。 --- 我知道它只是暂时的测试,但我需要很好地处理这些特定的基准
    • @Rolando,如果我有许多其他程序正在运行并且需要 MySQL 使用尽可能少的 RAM,这是否意味着我应该将 innodb 缓冲池设置为零?或者有最低要求吗?
    【解决方案2】:

    简单得多... 运行两次

    SELECT SQL_NO_CACHE ...;
    

    看看的时间。

    第一个预热buffer_pool;第二个通过SQL_NO_CACHE 避免了QC。 (在 MySQL 8.0 中,不要使用 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 值,因为它是“全局”,而不是“会话”。

    【讨论】:

    • 顺便说一句,SQL_NO_CACHE 对 MySQL 8 没有影响,查询缓存被删除,SQL_CACHE 修饰符也被删除。
    • @Ander - 谢谢。我喜欢让答案保持最新状态,因此我在注释中添加了已编辑的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多