2011-08-09 10 views
0

私がCreatorIDによって作成された試験のカウント質問を取得しています以下のクエリいる1001MySQLのクエリのパフォーマンス

SELECT count(Questions.question_id) QuestionCount 
    FROM Exams 
     LEFT JOIN Questions 
      ON Exams.exam_id = Questions.exam_id_fk 
    WHERE Exams.CreatorId='1001' 

私は、これは同じことを実行する10,000人のユーザーができることその可能性は本当に愚かな質問ですが、いくつかの点で知っています私はちょうどperformaceについて確かめたいです。それで、これよりも良い方法がありますか?

ありがとうございました。

答えて

3

あなたは、次のように速くする必要があります何の質問が定義されていない試験を必要としません提供:

SELECT 
    count(Questions.question_id) QuestionCount 
FROM Exams 
INNER JOIN Questions 
     ON Exams.exam_id = Questions.exam_id_fk 
WHERE Exams.CreatorId='1001' 

また作ります適切なフィールドにインデックスがあることを確認してください。クエリでEXPLAINを試してみてください。

+0

+1の 'explain' –

-1

これはかなり基本的なクエリです。

クエリパラメータが頻繁に変更されない場合、ビューを作成することが1つの最適化である可能性があります。

あなたはしてビューを作成するには、このリンクを使用することができ、可変views and varibles

+0

ビューはmysqlにキャッシュされません。これは実装の市長の不足です。 – Jacco

+0

MySqlはビューを別にキャッシュしませんが、ビューはクエリキャッシュに保持されます。http://rackerhacker.com/2007/08/08/mysqls-query-cache-explained/ – stimpy

+0

ビューに対する参加時にベンチマークを行いましたビューのクエリーに直接反映され、結果は強力にサポートされています。 'ビューはキャッシュされません'ステートメント。 – Jacco

1

あなたのLEFT JOININNER JOINになることができなかった理由は何ですか?

  • Exams.CreatorId
  • Exams.exam_id
  • Questions.exam_id_fk
+0

' LEFT'と 'INNER JOIN'を使うメリットは何ですか?私は常にINNERを使用することを認めますが、それを正当化できません。 –

+0

'INNER JOIN'は高速ですが、結合するレコードが見つからない場合は結果を省略します。 – Jacco

0

それは私にはよさそうだ:

また、あなたは上のインデックスを持っていることを確認してください。結合列が一致し、インデックスであることを確認してください。私はそれを事前に最適化しないだろう。

このクエリのパフォーマンスに問題がある場合は、テーブル名と列名のコンテキストで、テストの質問数を保存して更新できます。質問の追加と削除が多く発生していないと仮定します。

関連する問題