5.5中的MySQL长时间运行查询在5.6中非常快

时间:2013-04-29 07:44:48

标签: mysql

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

MySQL 5.6如何在毫秒和5.5中执行此操作需要一整分钟?

关于先解决什么问题的任何想法?

2 个答案:

答案 0 :(得分:4)

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

EXPLAIN SELECT ...

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

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

答案 1 :(得分:1)

经过几个小时的狩猎后,我自己找到了一个解决方案。 我只是在我的SELECT之后添加了STRAIGHT_JOIN这个句子,而且我在MySQL 5.5上的60秒查询现在已经下降到3毫秒了。

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

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