MySQL用子查询执行select需要这么长时间?

时间:2017-02-01 04:29:30

标签: mysql amazon-web-services amazon-rds-aurora aurora

当我连接到Aurora MySQL时,我尝试以下SQL

SELECT date, eventid
FROM `vw_KissMetricsAnalytics`
where eventid IN ( LOTS_OF_NUMS )

只需1秒钟,但当我将SQL更改为

SELECT *
FROM
(
SELECT date, eventid
FROM `vw_KissMetricsAnalytics`
where eventid IN ( LOTS_OF_NUMS )
) s;

这需要永远运行,不是他们应该是一样的吗?这会是可用内存的限制吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

你会认为MySQL应该意识到外部查询不会对结果添加任何内容,优化器应该只考虑它。但它没有。

在您显示的FROM子句中编写子查询会创建一个填充了子查询结果的临时表

临时表必须转换为行,存储在某处(取决于内存或磁盘上的行数),然后外部查询读取该临时表以提供最终结果。

这会给整个操作增加很多开销,并减慢你的工作。