1

私はphpとmysqlに基づいてMCQクイズを作成しています。これが私のメインテーブルの構造です:

クイズテーブル:クイズID、quiz_categoryカテゴリテーブル:id、タイトル...質問テーブル:id、クイズID、categoryid、タイトル...回答テーブル:id、質問ID .. ..

まず、150以上のクイズ、4つのカテゴリ、14000以上の質問、およびそれぞれの正解をテーブルに入力します。

時間を節約するために、質問ごとに、回答テーブルhttps://stackoverflow.com/editing-helpalongと他の3つのランダムな回答から正しい回答が取得されます。

たった2つのクイズでテストしていたところ、問題なく動作しました。しかし、150のクイズで、いくつかの問題が発生しました。

  • データベースは低速であり、後のクイズでは質問の読み込みに永遠に時間がかかります
  • 回答のランダム化は機能しなくなりました。正しい回答とともに、他のオプションにも同じエントリが表示されるため、ユーザーは正しい回答を簡単に推測できます。

以前のStackoverflowクエリで使用しているコードを確認できます。https://stackoverflow.com/questions/14826573/randomising-questions-and-answers-php-quiz-not-working

クイズプログラムが機能するための理想的なクエリは何かについてのアイデアはありますか?

4

1 に答える 1

0

パフォーマンスを改善する方法についていくつかのヒントを提供しますが、これらは一般的なものであり、完全ではない場合があります。

前の質問の PHP および SQL ステートメントを簡単に見てみると、インデックスの論理的な場所がいくつかあります。インデックスを追加するには、詳細についてMySQL のマニュアルを参照してください。

$sql4="select * from answers where question_id=".$row2['id'];

question_id にはインデックスが必要です

$sql2="select * from questions where quiz_id=".$_SESSION['quizid'];

quiz_id にはインデックスが必要です

これら 2 つのインデックスを追加すると、これに対する選択性も向上します。

$sql3="select * from answers where question_id in (select id from
questions where quiz_id =$row2[quiz_id]) order by rand()";

以前はクエリごとにフル テーブル スキャンを実行していたので、これは役に立ちます。

もう1つの問題は、ループがあり、反復ごとにコマンドを送信してデータベースにクエリを送信することです。ループの前にすべての情報を一度に収集し、反復ごとに個々のクエリを送信するのではなく、それを使用して反復する必要があります。

于 2013-02-20T09:47:56.757 に答える