MySQL中非常慢的子查询

Posted

技术标签:

【中文标题】MySQL中非常慢的子查询【英文标题】:Very slow subquery in MySQL 【发布时间】:2015-12-04 03:08:20 【问题描述】:

我有两个表 A 和 B(名称是抽象的)。表 A 和表 B 都有一个名为 date 的列。表 A 有大约 300 万行,列日期索引。表 B 有大约 100 万行。

我的以下查询运行得很慢(大约 20 秒):

SELECT * FROM A WHERE A.date > (select MAX(date) FROM B)

但是,如果我先单独运行子查询,它会非常快。如果我将日期替换到主查询中,它也非常快,因为表 A 中的数据被索引了。

我发现如果使用“IN”子句,这可能是个问题。但我的查询不使用 IN。有人可以帮助解释为什么这很慢吗?

谢谢!

【问题讨论】:

您正在从A 中选择每一列,其中包括non-indexed 列。 @vkp 在这种情况下,具有恒定日期的选择也应该很慢。 如果两次运行相同的查询,第二次会加快速度吗? 【参考方案1】:

将您的子查询作为派生表移动到 from 子句中,并在没有连接条件的情况下将其连接到表 A:

SELECT * FROM A, (select MAX(date) AS mdate FROM B) AS T WHERE A.date > T.mdate

这样可以确保子查询只计算一次。如果 A.date 在您编写时被索引,这应该会加快您的查询速度。在目前的形式中,我相信子查询是针对每条记录分别执行的。

【讨论】:

Shadow,不幸的是,这个查询也很慢,大约需要 20 秒。但是,如果我在没有子查询的情况下替换时间,只需要半秒。 mysql服务器是否开启了查询缓存?【参考方案2】:

select MAX(date) AS mdate FROM B 一个人要花多少时间?

如果您在 B.date 中也有索引,您可能可以节省很多时间

【讨论】:

以上是关于MySQL中非常慢的子查询的主要内容,如果未能解决你的问题,请参考以下文章

Postgres中非常慢的不同和排序方法

大数据库中非常慢的 MongoDB 计数

Swift中非常慢的扫雷递归算法

Windows 10 中非常慢的 git clone

Wordpress 自定义元查询搜索在 OR 关系中非常慢

PHP/Symfony 在 Docker 设置中非常慢