假设我有两张桌子,
Student Test
Id Name TestId Type StudentId
-- ---- ------ ---- ---------
1 Mark 774 Hard 1
2 Sam 774 Hard 2
3 John 775 Easy 3
现在我必须找到那些在MySql中进行“硬”测试的学生(学生ID,姓名和证词)。
哪一个更好(在性能方面)?。
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'
我可以知道原因吗?(假设有数百万学生和百万种类型的测试)
答案 0 :(得分:6)
两者都相同,但性能不同。如果您想使用更好的性能选择查询,我建议您使用EXPLAIN PLAN
进行查询。
请查看Understanding the Query Execution Plan。
此外,您可以使用INDEXES
为WHERE
子句中最常使用的列改进查询,您也可以查看关系代数。
答案 1 :(得分:0)
这些查询完全相同,并且应该具有完全相同的查询计划。执行时间不太可能存在任何可衡量的差异。
如果您将JOIN
更改为LEFT JOIN
,则会有所不同。在这种情况下,您需要使用第一个版本。第二个版本不会给出相同的结果。
答案 2 :(得分:0)
在性能方面,这两者大致相同。您可以使用EXPLAIN命令验证它。
因此,问题就变成了数据模型的清晰表达。看起来像天使在针头上跳舞。但是,如果您使用JOIN命令提取所有测试结果,然后询问子集,请使用WHERE type='hard'
。
但是,从概念上讲,如果只拉动那些较难的那些,那么请使用ON
表达式。
请注意,如果您使用LEFT JOIN
,这两种方法的工作方式会有所不同。如果您使用ON
表达式LEFT JOIN
,那么每个学生都会进行一次没有经过严格考试的学生,以及每个学生参加的每项艰苦考试的行。< / p>