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-index
ed 列。
@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中非常慢的子查询的主要内容,如果未能解决你的问题,请参考以下文章