【问题标题】:Mysql query run twice is must faster the second time even with SQL_NO_CACHE即使使用 SQL_NO_CACHE,Mysql 查询运行两次也必须更快
【发布时间】:2011-06-25 03:09:58
【问题描述】:

我正在尝试分析两个不同的查询,它们执行相同的操作以找出哪个更快。为了测试,我在两个查询中都放入了 SQL_NO_CACHE,以防止查询缓存弄乱时间。

查询 A 始终为 50 毫秒。 查询 B 第一次运行时为 100 毫秒,如果稍后我再次运行,则为 10 毫秒。

为什么第二次查询 B 更快?查询缓存不应该加速查询。可能是查询 B 的第一次运行将数据从磁盘加载到内存中,以便第二次查询在内存中运行并且更快?有没有办法测试这个?在运行查询 B 之前,我尝试通过从表中选择 * 来测试自己,但它仍然表现出相同的行为。 SQL_NO_CACHE 是否可能无法禁用查询缓存?

查询 B 如下所示: SELECT SQL_NO_CACHE foo,bar FROM table1 LEFT JOIN table2 ON table1.foo=table2.foo WHERE bar=1

【问题讨论】:

    标签: mysql


    【解决方案1】:

    根据您使用的存储引擎,是的,它很可能是从数据缓存而不是查询缓存加载的。

    MyISAM 不为数据提供存储引擎级别的缓存,仅缓存索引。但是,操作系统通常会从自己的缓存中提供数据,这很可能会加快您的查询执行速度。

    您可以尝试在真实场景中对查询进行基准测试,只需在每次执行特定查询时(连同其执行时间)将特定查询记录到数据库中。

    【讨论】:

    • 感谢您的提示。我应该提到我正在使用 innodb 表。有没有办法分辨什么在内存中,什么不在?
    • 据我所知,无法准确监控,因为它是操作系统的缓存。如果您使用的是 InnoDB,那么缓存数据的将是 InnoDB 的缓冲池,我不确定您是否可以关闭此选项。但它正在发挥作用。
    【解决方案2】:

    根据索引的大小和表类型,可能是第一次运行查询时索引不在内存中。因此 MySQL 会在第一次运行查询时将索引拉入内存,从而导致显着减速。下一次,MySQL 需要的大部分内容可能在内存中,从而提高性能。

    【讨论】:

      【解决方案3】:

      您的应用是否在第一次查询时建立连接并进行身份验证握手?如果是这样,第二个查询将已经有一个打开/经过身份验证的连接来执行。尝试第三次运行它,看看第二次和第三次尝试的时间是否接近。

      【讨论】:

      • 我正在终端中进行查询,因此应该没有连接启动成本。第三次及以上运行都很快。只有第一个查询很慢。
      • 即使终端必须在第一次执行时建立连接,我也不会感到惊讶。如果您打开多个终端怎么办?你得到相同的结果吗?
      猜你喜欢
      • 2014-04-10
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 2012-01-17
      • 2017-06-29
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多