0

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

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

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

4

2 回答 2

4

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

EXPLAIN SELECT ...

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

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

于 2013-04-29T08:21:49.903 回答
1

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

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

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

于 2013-04-29T11:16:45.957 回答