在“SQL优化(三)”中,我们分析了当id值相同时,SQL的执行顺序。这一篇将分析id值不同时SQL的执行。
先说结论:id越大,越先执行;id相同时,从上到下顺序执行。
为了验证上述结论,对于执行相同任务的等价查询语句,分别分析其执行过程。 任务:“查询教授SQL课程的老师的描述”,相关的表及数据,请参考“SQL优化(一)"。
1. id值相同
先构造id值相同的查询语句。
explain select TeacherCard.Description from TeacherCard ,Course, Teacher where Teacher.Id = Course.TeacherID and Teacher.CardID = TeacherCard.ID and Course.name = 'sql';
执行结果:
结论:id相同,从上到下顺序执行。
执行顺序为:TeacherCard, Course,Teacher,注意三张表上的数据量从小到大(分别为3,4,5)。
原因:生成的中间表数据量最小,效率较高。
2. id值不同
将上述多表查询语句改为子查询,即可构造id值不同的查询语句。
explain select Description from TeacherCard where ID = (select CardID from Teacher where ID = (select TeacherID from Course where name = 'sql'));
执行结果:
结论:id越大,越先执行。
执行顺序为:Course,Teacher,TeacherCard。
原因:在有子查询时,先执行内层查询,再执行外层查询。
3. id值部分相同
将上述语句改为部分多表查询,部分子查询,即可构造id值部分相同的查询语句。
explain select TeacherCard.Description from TeacherCard,Teacher where Teacher.CardID = TeacherCard.ID and Teacher.ID = (select TeacherID from Course where name='sql');
执行结果:
结论:id越大,越先执行;id相同,从上到下顺序执行。
执行顺序为:Course,TeacherCard,Teacher。
原因:Course表上的查询是子查询,所以先执行。TeacherCard,Teacher是多表查询,id值相同,TeacherCard表里数据量较小,所以先执行查询。最后Teacher表上的查询。