Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何清除/刷新mysql innodb缓冲池?_Mysql_Sql_Innodb - Fatal编程技术网

如何清除/刷新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查询缓存,但它与我无关,因为这两个查询无论如何都不会被缓存

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


运行每个查询后重新启动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-谢谢。我喜欢让答案保持最新,所以我在一个注释中添加了编辑的内容。