我有下面这两个查询,并注意到它们有巨大的性能差异
查询1
SELECT count(distinct b.id) FROM tableA as a
LEFT JOIN tableB as b on a.id = b.aId
GROUP BY a.id
查询2
SELECT count(distinct b.id) FROM tableA as a
LEFT JOIN (SELECT * FROM tableB) as b on a.id = b.aId
GROUP BY a.id
查询基本上是将一个表连接到另一个表,我注意到query1需要大约 80ms
而query2需要 2sec
在我的系统里有成千上万的数据。有人能解释一下为什么会这样吗?当我被迫使用query2样式时,只使用它是否是一个明智的选择?或者有没有比query2更好的方法来做同样的事情?
1条答案
按热度按时间z9smfwbn1#
当你更换
tableB
与(SELECT * FROM tableB)
您正在强制查询引擎具体化子查询或中间表结果。换句话说,在第二个查询中,您实际上并没有直接加入到tableB
,您正在加入某个中间表。因此,任何可能存在于tableB
使查询更快将不可用。根据您当前的示例,我认为没有理由使用第二个版本。但在某些情况下,您可能会被迫使用第二个版本。例如,如果您需要转换
tableB
在某种程度上,您可能需要一个子查询来实现这一点。