我有以下两个查询,并注意到它们在上有巨大的性能差异
Query1
SELECT count(distinct b.id) FROM tableA as a
LEFT JOIN tableB as b on a.id = b.aId
GROUP BY a.id
Query2
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更好的方法来做同样的事情?
用(SELECT * FROM tableB)
替换tableB
时,强制查询引擎实现子查询或中间表结果。换句话说,在第二个查询中,实际上并不是直接联接到tableB
,而是联接到某个中间表。因此,tableB
上可能存在的用于加快查询速度的任何索引都将不可用。根据您当前的示例,我认为没有理由使用第二个版本。
在某些情况下,您可能会被迫使用第二个版本。例如,如果您需要以某种方式转换tableB
,则可能需要一个子查询来执行此操作。