最近、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
うか?) - orはいつ使用します
NATURAL JOIN
かWHERE IN
?