SQL中的JOIN与WHERE的顺序会影响性能吗?

时间:2020-04-14 06:54:55

标签: mysql sql postgresql join where-clause

在SQL中,JOIN与WHERE的顺序在多大程度上影响查询的性能?

a)从A 加入 中选择[…](从B中选择[…] 条件 开启[…]

b)从A 加入 )中选择[…] [从B 中选择[…] 在[…]

我的内心感觉告诉我,选项a)应该表现得更好:如果我们先进行联接然后运行一个where,似乎比第一次在一个表上运行一个where的表现要差得多,而从结果来看,这样做加入。但是我不确定,因为这取决于SQL库本身的内部优化。

很高兴知道MySQL和MySQL的行为是否相同 PostgreSQL,以及它是否依赖其他装饰器,例如group byorder by

2 个答案:

答案 0 :(得分:1)

在所有其他因素相同的情况下,我希望A版本的性能要优于B版本,正如您似乎也希望的那样。这样做的主要原因是A版本允许数据库使用子查询中的WHERE子句抛出行。然后,该联接仅涉及一个较小的中间表。两者之间确切的性能差异将取决于基础数据和实际查询。请注意,甚至有可能两个查询都可以在后台优化为相同或非常相似的执行计划。

答案 1 :(得分:1)

Postgres具有智能优化器,因此在大多数情况下,这两个版本应具有相似的执行计划(稍后我将再次介绍)。

MySQL倾向于实现子查询。尽管在较新的版本中这已经变得更好,但我仍然建议避免使用它。实现子查询会阻止使用索引,并且可能会对性能产生重大影响。

一个警告:如果子查询很复杂,那么最好将其作为子查询的一部分进行过滤。例如,如果是聚合,则在聚合之前过滤 通常可以提高性能。就是说,Postgres很聪明地将条件推入子查询中。因此,如果外部过滤是在聚合中使用的键上,则Postgres足够聪明,可以将条件推送到子查询中。