2013-12-19 24 views
2

有三个MySQL表:为什么这个MySQL查询的解释计划只有三行?

enter image description here

要加入所有三个表,我们需要的是的PK,加上courseid指数:

alter table enrollment add index (courseid); 

查询:

select s.name, c.name, e.semesterid 
from student s 
join enrollment e on s.id=e.studentid 
join course c on c.id=e.courseid; 

解释计划:

+----+-------------+-------+--------+------------------+----------+---------+------------------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref    | rows | Extra  | 
+----+-------------+-------+--------+------------------+----------+---------+------------------+------+-------------+ 
| 1 | SIMPLE  | e  | index | PRIMARY,courseid | courseid | 4  | NULL    | 10 | Using index | 
| 1 | SIMPLE  | s  | eq_ref | PRIMARY   | PRIMARY | 4  | test.e.studentid | 1 |    | 
| 1 | SIMPLE  | c  | eq_ref | PRIMARY   | PRIMARY | 4  | test.e.courseid | 1 |    | 
+----+-------------+-------+--------+------------------+----------+---------+------------------+------+-------------+ 

解释计划看起来不错,索引将被使用,没有全表扫描。但问题在于,为什么这个计划只有三行?我期望四行。我希望:

  1. 表学生 - 主键
  2. 表入学率 - 主键< - 这一次我没有看到在计划之中,为什么呢?
  3. 表报名 - 指数courseid
  4. 表场 - 主键

查询联接三个表,这意味着两次将两个表。这意味着我希望利用四个指标。

enter image description here

http://sqlfiddle.com/#!2/b30132/2

+0

只要我一直在使用MySQL,查询中的每一行一行。 – siride

回答

0

它最终将有一个表扫描(你有没有where子句)

它是连接三个表在一起。两个债券。向下扫描一个,并使用索引链接到另外两个。在计划

BTW

三排 - 在他们两个CourseID一个PK有助于

编辑

为您的更新。

没有WHERE子句 - 所以需要的一切 没有排序或者

下去招生表。因为它是主键,所以使用CourseID。另一张桌子上也有课程(课程)。

因此得到了一个合作关系。现在需要找到学生位。看一个特定的招生名单,所以得到学生证,所以用学生的PK来找到学生的详细信息。

登记注册时无需注册登记