我有这个查询
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;
这是否意味着我的第二个查询已从优化器转换为第一种形式,并且我应该遵循第一种形式?
有没有办法检查优化器的新查询?
答案 0 :(得分:2)
SQL不是过程语言。这是一种描述性语言。查询描述您要生成的结果集。
使用内部联接,您的问题中的两个查询是相同的-它们在所有情况下都会产生相同的结果集。首选哪个是风格偏好。从优化的角度来看,MySQL应该以相同的方式对待这两者。
一个偏好是,单个表上的过滤器更适合WHERE
和ON
。
对于外部联接,这两个查询并不相同,您应该使用一个表达您的意图的查询。
答案 1 :(得分:0)
连接两个表后的第一个过滤器;而第二个表使用值过滤作为连接两个表的条件进行连接。您可以检查此线程:
答案 2 :(得分:0)
您可以检查执行两个查询所需的时间,但是无论如何,您都可以用两种方式编写查询,优化器将尝试 无论是第一个查询还是第二个查询,都可以优化查询。
答案 3 :(得分:0)
我喜欢这个规则:
ON ...
说出这些表是相关的。WHERE ...
过滤结果。这对于LEFT JOIN
来说很重要,因为ON
并不充当过滤器。
这表明您优化器对它们的处理方式相同:
EXPLAIN EXTENDED SELECT ...
SHOW WARNINGS;