最近,我处理了从 MySQL 数据库中检索包含数千条记录的大量数据。由于是第一次处理这么大的数据集,所以没有考虑SQL语句的效率。问题来了。
以下是数据库的表(它只是一个课程系统的简单数据库模型):
课程:
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| course_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| lecturer | varchar(20) | NO | | NULL | |
| credit | float | NO | | NULL | |
| week_from | tinyint(3) unsigned | NO | | NULL | |
| week_to | tinyint(3) unsigned | NO | | NULL | |
+-----------+---------------------+------+-----+---------+----------------+
选择:
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| select_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| card_no | int(10) unsigned | NO | | NULL | |
| course_id | int(10) unsigned | NO | | NULL | |
| term | varchar(7) | NO | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
当我想检索一个学生选择的所有课程(带有他的卡号)时,SQL 语句是
SELECT course_id, name, lecturer, credit, week_from, week_to
FROM `course` WHERE course_id IN (
SELECT course_id FROM `select` WHERE card_no=<student's card number>
);
但是,它速度极慢,很长一段时间都没有返回任何东西。所以我把WHERE IN
子句改成了NATURAL JOIN
. 这是SQL,
SELECT course_id, name, lecturer, credit, week_from, week_to
FROM `select` NATURAL JOIN `course`
WHERE card_no=<student's card number>;
它立即返回并且工作正常!
所以我的问题是:
NATURAL JOIN
和WHERE IN
子句有什么区别?- 是什么让他们表现不同?(这可能是因为我没有设置任何东西
INDEX
吗?) - 我们什么时候使用
NATURAL JOIN
orWHERE IN
?