如果我们将“Where”放在Join Table中或将其放在最后,哪个Query更快?

时间:2014-01-10 05:42:43

标签: mysql sql

好的,我使用的是Mysql DB。我有2个简单的表格。

Table1
ID-Text
12-txt1
13-txt2
42-txt3
.....

Table2
ID-Type-Text
13- 1 - MuTxt1
42- 1 - MuTxt2
12- 2 - Xnnn

现在我想加入这两个表来获取表2中Type=1的所有数据

SQL1:

Select * from 
Table1 t1 
Join
(select * from Table2 where Type=1) t2
on t1.ID=t2.ID

SQL2:

Select * from 
Table1 t1 
Join
Table2 t2
on t1.ID=t2.ID
where t2.Type=1

这两个查询给出相同的结果,但哪一个更快?

我不知道Mysql如何处理Join(或者如何在Mysql中使用Join)&这就是为什么我不知道这个!!

Exxtra info,现在如果我不想要type = 1但是想要t2.text ='MuTxt1',那么Sql2将成为

Select * from 
Table1 t1 
Join
Table2 t2
on t1.ID=t2.ID
where t2.text='MuTxt1'

我觉得这个查询比较慢?

3 个答案:

答案 0 :(得分:1)

根据我的观点,第二个查询在代码可读性和性能方面比第一个查询更好。您可以在Join子句中包含过滤条件,如

Select * from 
Table1 t1 
Join
Table2 t2 on t1.ID=t2.ID and t2.Type=1

您可以在此处比较SQL中所有查询的执行时间:

Query 1

Query 2

My Query

答案 1 :(得分:1)

有时MySQL查询优化器的工作相当不错,有时候很糟糕。话虽如此,我的答案有例外,优化器会更好地优化其他内容。

子查询通常很昂贵,因为MySQL需要单独执行和存储结果。通常,如果您可以使用子查询或连接,则连接速度更快。特别是当使用子查询作为where子句的一部分时,不要对其进行限制。

Select *
from Table1 t1
  Join Table2 t2 on t1.ID=t2.ID
where t2.Type=1

Select *
from Table1 t1
  Join Table2 t2
where t1.ID =t2.ID AND t2.Type=1

应该同样表现良好,而

Select *
  from Table1 t1 
Join (select *
  from Table2
  where Type=1) t2
  on t1.ID=t2.ID
当pp将select * from Table2 where Type=1的结果存储到临时表中时,

很可能会慢得多。

通常通过构建一个表来加入工作,该表由两个表中的所有行组合组成,然后删除与条件不匹配的行。 MySQL当然会尝试使用包含on子句中比较的列并在where子句中指定的索引。 如果您对使用哪些索引感兴趣,请在查询前写下EXPLAIN并执行。

答案 2 :(得分:0)

我认为这个问题很难回答,因为我们并不完全了解数据库中查询解析器的内部结构。通常这些结构由数据库以类似的方式进行评估(它可以看到第一个和第二个查询是相同的,因此正确地解析它,或者不是。)

我会写第二个,因为它更清楚发生了什么。