使用子查询和连接的差异

Discrepancy using subquery and join

我正在尝试改进 Android 项目中的一些查询,我在许多网站上读到,使用连接当然比使用子查询更快。 所以我尝试更改一个使用 8 个子查询的查询,该查询使用 3 个左连接和 3 个选择。 当 运行 在测试数据库上时,我发现第一个使用 8 个子查询的速度比使用连接的快。

我尝试了 运行 EXPLAIN QUERY PLAN 命令并得到以下结果:

使用子查询


使用加入



我的联接是否做错了什么?为什么第一个查询比第二个查询结束得更快? 注意:事实证明,不在联接内使用这 3 个选择非常困难,因为我需要计算某个数据出现的次数。

答案很简单:不是正确的是,使用 JOIN 总是比使用子查询更快。相反,以我的经验,更准确的说法是子查询更有可能被低效使用。

更多信息:

最终,如您所知,子查询和 JOIN 都被您的数据库引擎分解为一个查询计划。您的数据库引擎根据它如何解释您的 SQL 在它认为可以的查询计划中采用快捷方式。因此,您可以通过明确可以使用哪些快捷方式来提高 SQL 的效率。

在您的情况下,您使用 JOIN 重写 SQL 的辛勤工作似乎使数据库引擎更难设计有效的查询计划。值得注意的是,基于 JOIN 的 SQL 包括一个(相对较慢的)AUTOMATIC COVERING INDEX;然而,数据库引擎能够坚持使用现有的基于子查询的主键索引 SQL.

也就是说,基于 JOIN 的查询计划确实看起来更短,因此如果您能够相应地构建 INDEX,它可能会 运行 更快。