高效的SQL查询

时间:2009-04-19 03:59:24

标签: mysql performance

注意:这些不是作业问题。我正在研究自己的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);

哪一个会更有效率?为什么呢?

4 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

我认为子查询(在您的情况下为第二个选项)可以运行得更快,因为它们限制了返回的行数以及返回的列数。左外连接的第一个选项可能更慢,内存更密集。但同样,它可能取决于其他几个因素,如返回的行数,列上的索引等。

答案 2 :(得分:0)

  

哪一个会更有效率?

一如既往:它取决于表中的内容以及索引的内容。

通常,默认情况下,连接比子查询更可取。它会查看每位教师,然后直接进入课程表以查找teacher_id的匹配项。希望您已经在'Courses.teacher_id'上创建了一个索引,这将是一个简单的简单查找。

但是如果你不这样做,子查询可能会更快。如果您有相当少的教师教授的课程很多,这将会扫描一次表生成一个小的临时表,然后可以更快地检查教师表中的每一行。

但在这种情况下,最好只添加索引。

答案 3 :(得分:-2)

我会推荐第三个选项 - 那就是在你的第二个选项中添加一个不同的子句并给它一个去。

我会投票给第二个选项更有效率(特别是添加了distinct子句)。您希望在两个表中都在teacher_id上添加索引。

编辑:
我只是注意到这是一个技巧问题 - 课程中没有teacher_id字段。

如果不止一位教师可以教授课程 - 添加一个表Teacher_Course(我总是避免使用对象名中的复数 - 只是一种练习)。在这个新表中存储了TeacherCourseId(系统生成的id),course_id和teacher_id,你可以允许每个班级有一个以上的老师。