当前位置: 首页 > 知识库问答 >
问题:

测试sql执行时间如何排除mysql buffer pool的影响?

章增
2023-04-22

如题,我想测试各种环境下mysql的代码执行时间,但是mysql自带的buffer pool的缓存无法让我知道实际的代码执行时间,因为同一条sql第二次就走缓存了。请问如何关闭mysql的buffer pool呢?我百度只查到如何设置buffer pool的大小,但是没有关闭的方法。唯一清空buffer pool的方法是重启mysql服务,这样实在太费时了。请问测试sql时如何排除buffer pool带来的影响呢?

共有2个答案

祝宏放
2023-04-22

要排除MySQL缓冲池的影响,有3种方法:

  1. 清空缓冲池:使用以下命令清空缓冲池:

    mysql> FLUSH TABLES;
    mysql> RESET QUERY CACHE;

    它会清空MySQL的缓冲池和查询缓存,确保每次查询都是从磁盘读取数据。

  2. 禁用缓冲池:可以通过在MySQL配置文件中禁用缓冲池来排除其影响。在my.cnf文件中添加以下行:

    [mysqld]
    skip-innodb_doublewrite
    innodb_flush_method=O_DIRECT
    innodb_flush_log_at_trx_commit=0

    这将禁用InnoDB的双写缓冲区和事务提交日志,并将InnoDB的刷新方法设置为O_DIRECT,以确保每次查询都是从磁盘读取数据。

  3. 使用不同的测试环境:可以在不同的测试环境中运行测试,例如在生产环境之外的测试环境中运行测试,以确保缓冲池的影响最小化。
赵晟睿
2023-04-22

关闭 MySQL 的 Buffer Pool 是不可行的,因为 Buffer Pool 是 MySQL 运行的核心之一,主要作用是提高查询速度。如果关闭 Buffer Pool,MySQL 的性能将会大幅下降。

而且,关闭 Buffer Pool 并不能真实反映查询的性能,因为在实际使用中,Buffer Pool 是必然存在的,无法避免。

建议您可以考虑以下方法来排除 Buffer Pool 的影响:

在每次测试之前,清空 Buffer Pool:可以使用 FLUSH TABLES 或 RESET QUERY CACHE 来清空 Buffer Pool,以确保每次测试都是从磁盘中读取数据。

使用不同的数据集:可以使用不同的数据集进行测试,以避免同样的数据在 Buffer Pool 中重复使用。

关闭查询缓存:可以在 MySQL 配置中将查询缓存关闭,以避免查询的结果被缓存。可以在配置文件 my.cnf 中添加以下内容:

query_cache_type = OFF
query_cache_size = 0

以上三种方法能够让您更加准确地测试查询性能,避免了 Buffer Pool 对测试结果的影响。但是要注意,这三种方法有可能会降低实际部署环境中的性能,应在测试环境中使用。

 类似资料:
  • 问题内容: 有些sql写得不好。有时,搜索需要花费数小时的申请时间。当一个应用程序(可能是一个网站)提交运行时间很长的查询时,我必须重新启动mysql。如何在数据库端限制sql查询的执行时间? 问题答案: 要在很长的执行时间后自动终止MySQL中的查询,请执行以下操作: 创建一个存储过程为: 然后在curosr的循环中执行以下操作: 创建,只是里面的上述步骤。 注意:KILL QUERY只是杀死查

  • 我的maven项目在构建应用程序时执行maven-surefire-plugin V2.22.0测试。默认情况下,surefire执行的日志级别是INFO,这个插件使用[org.apache.logging.slf4j.log4JLoggerFactory]。 我不希望我的构建过程在执行:maven-surefire-plugin:2.22.0:test(default-test)时记录这些跟踪

  • 问题内容: 我的文件夹包含单元测试和功能测试。功能测试的类路径中有单词,而单元测试中没有。那么,如何仅运行单元测试? 非常感谢你。 PS :我知道很容易使用“包含”逻辑来选择测试。例如,仅在我的情况下运行功能测试,我可以简单地使用此功能。 但是,我不知道如何以简单的方式排除测试。 顺便说一句,我正在使用gradle 1.11。 问题答案: 任务的文档通过一个示例和所有内容对其进行了说明:

  • 问题内容: 我需要获取执行时间(以毫秒为单位)。 我最初在2008年问这个问题。当时接受的答案是使用。new Date().getTime()但是,我们大家都可以同意,使用标准performance.now()API更合适。因此,我正在更改对此答案的公认答案。 问题答案: 使用 : NodeJs:需要导入performance类 使用:(非标准)(生活水平)

  • 在我的根项目中,我有两个子项目具有这种包结构。 在项目1中,我有一个用大规定义的类,就像这样 问题是,如果我运行该测试,它也会分析项目2中的所有内容。我如何排除包com.app.api?

  • 问题内容: 有没有一种简单的方法可以测量由JDBC执行的所有sql语句的执行时间,并将结果打印到输出中? 有人可能建议我使用AOP来做到这一点,但我尝试尽可能避免这种情况。还有另一种方法吗? 问题答案: 如果不在提供数据源的应用程序服务器中运行该应用程序,则将发现log4jdbc项目很有用。项目提供的记录器将允许您记录所执行的SQL语句的执行情况。 通过将从DataSource返回的连接包装在Co