注意:这些不是作业问题。我正在研究自己的dbms,因此这些 类似家庭作业的问题。
两张桌子:
Teachers (teacher_id, teacher_name)
Courses (teacher_id,course_id, course_name)
为了选择不教授任何课程的教师姓名,有 我能想到的两个问题:
mysql> explain select teacher_name from teachers left join courses on (teachers.
teacher_id = courses.teacher_id) where course_id is null;
mysql> explain select teacher_name from teachers where teacher_id not in (select
teacher_id from courses);
哪一个会更有效率?为什么呢?
答案 0 :(得分:3)
连接通常比子选择更快。
http://www.codersrevolution.com/index.cfm/2008/7/31/MySQL-performance-INNER-JOIN-vs-subselect
答案 1 :(得分:0)
我认为子查询(在您的情况下为第二个选项)可以运行得更快,因为它们限制了返回的行数以及返回的列数。左外连接的第一个选项可能更慢,内存更密集。但同样,它可能取决于其他几个因素,如返回的行数,列上的索引等。
答案 2 :(得分:0)
哪一个会更有效率?
一如既往:它取决于表中的内容以及索引的内容。
通常,默认情况下,连接比子查询更可取。它会查看每位教师,然后直接进入课程表以查找teacher_id的匹配项。希望您已经在'Courses.teacher_id'上创建了一个索引,这将是一个简单的简单查找。
但是如果你不这样做,子查询可能会更快。如果您有相当少的教师教授的课程很多,这将会扫描一次表生成一个小的临时表,然后可以更快地检查教师表中的每一行。
但在这种情况下,最好只添加索引。
答案 3 :(得分:-2)
我会推荐第三个选项 - 那就是在你的第二个选项中添加一个不同的子句并给它一个去。
我会投票给第二个选项更有效率(特别是添加了distinct子句)。您希望在两个表中都在teacher_id上添加索引。
编辑:
我只是注意到这是一个技巧问题 - 课程中没有teacher_id字段。
如果不止一位教师可以教授课程 - 添加一个表Teacher_Course(我总是避免使用对象名中的复数 - 只是一种练习)。在这个新表中存储了TeacherCourseId(系统生成的id),course_id和teacher_id,你可以允许每个班级有一个以上的老师。