0

当我连接到 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;

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

4

1 回答 1

2

你会认为 MySQL 应该意识到外部查询不会对结果添加任何内容,优化器应该只是将其排除在外。但事实并非如此。

FROM像您展示的那样在子句中编写子查询会创建一个临时表,其中填充有子查询的结果。

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

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

于 2017-02-01T04:35:07.690 回答