2009-04-19 13 views
2

注:これは宿題の問題ではありません。私は自分自身でdbmsを勉強しています。したがって、これらの の宿題のような質問です。効率的なSQLクエリ

2つのテーブル:

Teachers (teacher_id, teacher_name) 
Courses (teacher_id,course_id, course_name) 

任意のコースを教えていない教師の名前を選択するために、私は考えることができる 2つのクエリがあります。一つは、より効率的になります

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); 

は、 ?どうして?

+0

コーステーブルにTeacherIDを追加する必要があります。 –

答えて

-2

私は第3のオプションをお勧めします - それはあなたの2番目のオプションに別の句を追加し、それを実行することです。

2番目のオプションは、より効率的であると投票します(特にdistinct句が追加された場合)。うまくいけば、両方のテーブルのteacher_idにインデックスを追加しました。

編集:
私はちょうどそれがトリックの問題であることに気付きました - コースにteacher_idフィールドはありません。

複数の教師がコースを教えることができる場合は、Teacher_Courseテーブルを追加してください(私は常に複数のオブジェクト名を避けています)。この新しいテーブルには、TeacherCourseId(システム生成ID)、course_id、およびteacher_idが格納されています。クラスごとに複数の教師を許可することができます。

0

私は、彼らが行の量が戻っても、列の量が返さ制限するため、サブクエリ(あなたの場合の第2のオプション)を高速に実行できると思います。左外部結合の最初のオプションは、より遅く、よりメモリを消費します。しかし、やはり、返される行数、列のインデックスなど、いくつかの要因に依存する可能性があります。

0

どちらが効率的でしょうか?

いつものように:それはテーブルの内容とインデックスの対象によって異なります。

通常、デフォルトでは、サブクエリよりも結合が優先されます。各教師を見てから、コーステーブルに直接進み、teacher_idと一致するものを見つけます。うまくいけば、あなたは 'Courses.teacher_id'にインデックスを作成しています。これは単純な検索となるでしょう。

ただし、そうしないと、サブクエリが速くなる可能性があります。あなたが比較的少数の教師によって教えられたコースをたくさん持っているなら、これはテーブルスキャンを1回実行して小さなテンポラリテーブルを生成します。

しかし、その場合は、代わりにインデックスを追加するほうがよいでしょう。

関連する問題