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 中非常快的主要内容,如果未能解决你的问题,请参考以下文章

升级到5.6后Mysql在所有字段中搜索字符串变慢

MySQL初识

MySQL管理长时间运行查询

sql 在MySQL中查找长时间运行的查询

自动杀死长时间运行的查询(MySql),Apache Tomcat DataSource

MySQL 管理长时间运行查询