Mysql WHERE条款和ON条款中的条件
假设我有两张桌子Mysql WHERE条款和ON条款中的条件,mysql,sql,Mysql,Sql,假设我有两张桌子 Student Test Id Name TestId Type StudentId -- ---- ------ ---- --------- 1 Mark 774 Hard 1 2 Sam 774
Student Test
Id Name TestId Type StudentId
-- ---- ------ ---- ---------
1 Mark 774 Hard 1
2 Sam 774 Hard 2
3 John 775 Easy 3
现在我必须找到那些在MySql中进行了“硬”测试的学生(学生id、姓名和testid)
哪一个更好(在性能方面)
我可以知道原因吗?(假设有数百万学生和数百万种测试)这些查询完全相同,应该有完全相同的查询计划。执行时间不太可能有任何可测量的差异 但是,如果将
JOIN
更改为LEFT JOIN
,则会有不同。在这种情况下,您需要使用第一个版本。第二个版本不会给出相同的结果。两者都相同,但性能不同。如果您想选择性能更好的查询,我建议您使用EXPLAIN PLAN
进行查询
看看
此外,您还可以使用
索引改进查询,对于WHERE
子句中使用频率最高的列,您还可以查看关系代数。从性能角度看,这两种方法大致相同。您可以使用EXPLAIN命令验证这一点
因此,问题变成了数据模型表达的清晰性。这看起来像是天使在大头针上跳舞。但是,如果您要使用JOIN命令提取所有测试结果,然后请求子集,请使用WHERE type='hard'
但是,如果从概念上讲,你只是在做一些困难的事情,那么就按照
的公式去做
请注意,如果使用
左联接
,这两种方法的工作方式将不同。如果将公式与左连接一起使用,您将为每个没有参加过硬测试的学生获得一行,以及每个学生参加过的硬测试获得一行。如果您通过分析器运行查询,执行计划中的差异是什么?(附带问题:Test
与User
真的是多对一吗?也许我不知道你的领域,但我认为会有有限数量的测试实体和有限数量的用户实体,以及两者之间的多对多关系。真的有数百万个唯一的测试实体吗?)@David是的,这是一个多对多的关系,但我的示例没有显示出来…是的,可能我说了数百万个唯一的实体有点夸张了。但我说有许多唯一的测试类型的原因是,我认为对于少数唯一的实体,两个查询都有相同的性能,但对于大量的实体,差异可能很大。@vyegorov请正确阅读问题…我不是说左外联接。我还知道where子句在联接后执行…我只想知道性能,我想使用explain plan,但我可以作为web服务运行查询。(即,我键入查询,当我单击run时,将调用一个web服务,返回结果)。所以我没有解释计划的权限。而且,我只有100多条记录。所以性能上的差异不会很大。您可以创建本地数据库,创建并填充表,然后创建要使用的语句,并测试它们哪一条性能最好。@kannan:“而且,我只有100多张唱片。所以表现上的差异不会太大。”如果差异不会太大,为什么你会在意哪个更快?
1.Select student.id,student.name,test.testid
from student
join test
on test.studentid=student.id and test.type='hard'
2.Select student.id,student.name,test.testid
from student
join test
on test.studentid=student.id
where test.type='hard'