mysql性能比较

mw3dktmi  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(352)

我有下面这两个查询,并注意到它们有巨大的性能差异
查询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更好的方法来做同样的事情?

z9smfwbn

z9smfwbn1#

当你更换 tableB(SELECT * FROM tableB) 您正在强制查询引擎具体化子查询或中间表结果。换句话说,在第二个查询中,您实际上并没有直接加入到 tableB ,您正在加入某个中间表。因此,任何可能存在于 tableB 使查询更快将不可用。根据您当前的示例,我认为没有理由使用第二个版本。
但在某些情况下,您可能会被迫使用第二个版本。例如,如果您需要转换 tableB 在某种程度上,您可能需要一个子查询来实现这一点。

相关问题