内部连接条件或在哪里使用?

时间:2019-07-15 18:45:22

标签: mysql sql query-optimization

我有这个查询

SELECT t1.col1
FROM table1 t1
INNER JOIN table2 t2 ON t2.col1 = t1.col1
WHERE t2.col IN (1, 2, 3)

和该查询

SELECT t1.col1
FROM table1 t1
INNER JOIN table2 t2 ON t2.col1 = t1.col1 AND t2.col IN (1, 2, 3)

两个人都给我一个相同的执行计划并告诉我

Using where;

这是否意味着我的第二个查询已从优化器转换为第一种形式,并且我应该遵循第一种形式?

有没有办法检查优化器的新查询?

4 个答案:

答案 0 :(得分:2)

SQL不是过程语言。这是一种描述性语言。查询描述您要生成的结果集。

使用内部联接,您的问题中的两个查询是相同的-它们在所有情况下都会产生相同的结果集。首选哪个是风格偏好。从优化的角度来看,MySQL应该以相同的方式对待这两者。

一个偏好是,单个表上的过滤器更适合WHEREON

对于外部联接,这两个查询并不相同,您应该使用一个表达您的意图的查询。

答案 1 :(得分:0)

连接两个表后的第一个过滤器;而第二个表使用值过滤作为连接两个表的条​​件进行连接。您可以检查此线程:

SQL join: where clause vs. on clause

答案 2 :(得分:0)

您可以检查执行两个查询所需的时间,但是无论如何,您都可以用两种方式编写查询,优化器将尝试 无论是第一个查询还是第二个查询,都可以优化查询。

答案 3 :(得分:0)

我喜欢这个规则:

  • ON ...说出这些表是相关的
  • WHERE ... 过滤结果。

这对于LEFT JOIN来说很重要,因为ON并不充当过滤器。

这表明您优化器对它们的处理方式相同:

EXPLAIN EXTENDED SELECT ...
SHOW WARNINGS;