MySQL 5.5 中的长时间运行查询在 5.6 中非常快
Posted
技术标签:
【中文标题】MySQL 5.5 中的长时间运行查询在 5.6 中非常快【英文标题】:MySQL long running query in 5.5 is very fast in 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服务器的配置是完全一样的吗?
【参考方案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 按照查询中指定的顺序读取表并绕过连接优化器。
【讨论】:
以上是关于MySQL 5.5 中的长时间运行查询在 5.6 中非常快的主要内容,如果未能解决你的问题,请参考以下文章