好的,我使用的是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'
我觉得这个查询比较慢?
答案 0 :(得分:1)
根据我的观点,第二个查询在代码可读性和性能方面比第一个查询更好。您可以在Join子句中包含过滤条件,如
Select * from
Table1 t1
Join
Table2 t2 on t1.ID=t2.ID and t2.Type=1
您可以在此处比较SQL中所有查询的执行时间:
答案 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)
我认为这个问题很难回答,因为我们并不完全了解数据库中查询解析器的内部结构。通常这些结构由数据库以类似的方式进行评估(它可以看到第一个和第二个查询是相同的,因此正确地解析它,或者不是。)
我会写第二个,因为它更清楚发生了什么。