【问题标题】:MySQL long running query in 5.5 is very fast in 5.6MySQL 5.5 中的长时间运行查询在 5.6 中非常快
【发布时间】:2013-04-29 07:44:47
【问题描述】:

我有一个复杂的数据库架构。 我在 MySQL 5.6 中构建了一个连接 20 个表的大查询。 当我在我的 Mac 上的 MySQL 5.6 的本地副本上运行查询时,我得到 1-2 毫秒的响应时间。 当我在 Ubuntu 上的 MySQL 5.5 上运行相同的查询(通过 mysql 转储使用相同的数据)时,我得到 60 秒的响应时间。 我对慢速查询进行了分析,发现几乎整整 60 秒都花在了“统计”阶段。 “统计”阶段显然是 MySQL 确定如何最好地执行所有连接的地方。

MySQL 5.6 如何以毫秒为单位执行此操作,而在 5.5 中则需要整整一分钟?

关于首先解决什么问题有什么想法吗?

【问题讨论】:

  • 您能否向我们提供更多信息,例如您在这两个数据库上使用的 Engine 是什么?或者你的电脑的规格?也许只有在那里你才能找到原因。
  • 你的mysql服务器的配置是完全一样的吗?

标签: mysql


【解决方案1】:

MySQL 5.6(和 MariaDB)优化器在子查询和连接方面做得更好。我猜您的查询在 5.5 中没有得到很好的优化。运行:

EXPLAIN SELECT ...

在两个 MySQL 版本上,了解 MySQL 应该做什么,以及在 5.5 中真正做什么。然后,尝试 FORCE 使用 5.6 使用的索引。

编辑:如果是子查询,您可以将其重写为连接。 MySQL 5.6 在某些情况下会在内部执行此操作。

【讨论】:

    【解决方案2】:

    经过几个小时的搜寻,我自己找到了解决方案。 我只是在 SELECT 之后添加了 STRAIGHT_JOIN 子句,神奇的是,我在 MySQL 5.5 上的 60 秒查询现在缩短到了 3 毫秒。

    所以 MySQL 5.6 对我的大型查询没有问题,但 MySQL 5.5 有。所以我猜连接优化器搞砸了表顺序。

    使用 STRAIGHT_JOIN 强制 MySQL 按照查询中指定的顺序读取表并绕过连接优化器。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2014-01-28
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多