5

2つのテーブルがあると仮定します。

   Student                           Test

Id    Name                   TestId   Type  StudentId
--    ----                   ------   ----  --------- 
1     Mark                     774    Hard     1  
2     Sam                      774    Hard     2 
3     John                     775    Easy     3

ここで、MySqlで「ハード」タイプのテストを受けた学生(学生ID、名前、およびtestid)を見つける必要があります。

どちらが良いですか(パフォーマンスの観点から)?

1.Select student.id,student.name,test.testid 
  from student 
  join test 
  on test.studentid=student.id and test.type='hard'

2.Select student.id,student.name,test.testid 
  from student 
  join test 
  on test.studentid=student.id 
  where test.type='hard'

理由を教えてもらえますか?(数百万の学生と数百万の種類のテストがあると仮定します)

4

3 に答える 3

6

どちらも同じですが、パフォーマンスが異なりますパフォーマンスEXPLAIN PLANの高いクエリを選択する場合は、クエリに使用することをお勧めします。

クエリ実行プランについてをご覧ください。

INDEXESまた、句で最も頻繁に使用している列のクエリを改善できますWHERE。関係代数も確認できます。

于 2012-07-05T11:20:52.650 に答える
0

これらのクエリはまったく同じであり、まったく同じクエリプランを持つ必要があります。実行時間に測定可能な違いが生じる可能性はほとんどありません。

JOINただし、に変更すると違いがありますLEFT JOIN。その場合、最初のバージョンを使用する必要があります。2番目のバージョンでは同じ結果は得られません。

于 2012-07-05T11:19:56.803 に答える
0

パフォーマンスに関しては、これら2つはほぼ同じです。EXPLAINコマンドを使用してそれを確認できます。

したがって、問題はデータモデルの表現の明確さの1つになります。天使がピンの頭で踊っているように見えるかもしれません。ただし、JOINコマンドを使用してすべてのテスト結果を取得し、サブセットを要求する場合は、を使用してくださいWHERE type='hard'

しかし、概念的には、難しいものだけを引っ張っている場合は、ON定式化を行ってください。

を使用すると、これら2つの動作が異なることに注意してくださいLEFT JOINONを使用した定式化を使用すると、ハードテストを行ったことがない各学生の行と、各学生が受けた各ハードテストの行が表示されますLEFT JOIN

于 2012-07-05T11:26:58.887 に答える