4 回答
TA贡献1842条经验 获得超21个赞
摘自MySQL手册(13.2.10.11重写子查询作为连接):
LEFT [OUTER] JOIN可以比等效的子查询更快,因为服务器可能能够更好地优化它 - 这一事实并非仅针对MySQL Server。
因此子查询可能比较慢LEFT [OUTER] JOIN
,但在我看来,它们的强度可读性稍高。
TA贡献1765条经验 获得超5个赞
子查询是解决形式问题的逻辑上正确的方法,“从A获取事实,以B中的事实为条件”。在这种情况下,在子查询中粘贴B比进行连接更合乎逻辑。从实际意义上说,它也更安全,因为你不必因为多次匹配B而从A中获取重复的事实时要谨慎。
然而,实际上,答案通常归结为性能。一些优化器在给出连接和子查询时会吮吸柠檬,而另一些优化者则以另一种方式吮吸柠檬,这是特定于优化器,特定于DBMS的版本和查询特定的。
从历史上看,显式连接通常会获胜,因此连接的既定智慧更好,但优化器一直在变得越来越好,所以我更喜欢先以逻辑连贯的方式编写查询,然后在性能限制要求时进行重组。
TA贡献2041条经验 获得超4个赞
在大多数情况下,JOIN
s比子查询更快,并且子查询的速度非常快。
在JOIN
SDB中,RDBMS可以创建一个更适合您的查询的执行计划,并且可以预测应该加载哪些数据以进行处理并节省时间,这与子查询不同,后者将运行所有查询并加载所有数据以进行处理。
子查询的好处是它们比JOIN
s 更具可读性:这就是大多数新SQL用户更喜欢它们的原因; 这是简单的方法; 但是在性能方面,JOINS在大多数情况下都更好,即使它们也不难读。
TA贡献1804条经验 获得超2个赞
使用EXPLAIN查看数据库如何对数据执行查询。在这个答案中有一个巨大的“取决于”......
当PostgreSQL认为一个子查询比另一个更快时,它可以将子查询重写为连接或子查询的连接。这一切都取决于数据,索引,相关性,数据量,查询等。
添加回答
举报