下面有两个查询,发现它们之间存在巨大的性能差异
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更好的方法来做同样的事情呢?
答案 0 :(得分:4)
将tableB
替换为(SELECT * FROM tableB)
时,将强制查询引擎实现子查询或中间表结果。换句话说,在第二个查询中,您实际上并没有直接联接到tableB
,而是联接了一些中间表。结果,在tableB
上可能存在以使查询更快的任何索引将不可用。根据您当前的示例,我认为没有理由使用第二个版本。
在某些情况下,您可能会被迫使用第二个版本。例如,如果您需要以某种方式转换tableB
,则可能需要一个子查询来完成。