2013-12-19 54 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來找到學生的詳細信息。

登記註冊時無需註冊登記